【问题标题】:How can we reduce the unnecessary loading of objects?我们如何减少不必要的对象加载?
【发布时间】:2009-08-17 12:32:41
【问题描述】:

在休眠和简单的 ORM 策略中,我通常会加载对象的所有值。有什么办法可以避免这种情况。 因此,我的应用程序运行缓慢..

【问题讨论】:

    标签: java performance hibernate orm


    【解决方案1】:

    有几种方法可以实现这一点:

    • 启用缓存。虽然 SQL 不会改变,但 Hibernate 将比较来自数据库的结果并重用现有对象。这不会带来巨大的提升,但它很容易实现和维护。

    • 创建第二个映射(相同的表,不同的对象)以仅加载值的子集。

    • 将很少使用的数据移到第二个表中。

    • 使用自定义本机 SQL 查询加载您的对象。在这里,您必须确保知道已加载了多少以及如何“填补空白”。

    【讨论】:

      【解决方案2】:

      Hibernate 参考文档有一章关于Improving Performance。您可以查看您的获取策略或使用缓存是否会提高性能。

      更具体地说,您需要提供有关您的应用程序以及如何使用通过 ORM 加载的对象的更多详细信息。

      【讨论】:

      • 通常加载依赖对象会导致 ORM 性能受损。您需要根据您需要导致另一个提取的子属性的可能性来设置您的提取策略攻击性。例如,检索 Address 对象或 Orders 集合的人员对象。可能需要地址,所以加载它,但订单可能不需要,所以不要那么激进。
      【解决方案3】:

      在 yoru 实体映射中使用 FetchType.LAZY。 即:

      @Entity
      public class MyEntity {
      
      private List<MyAnotherEntity> values;
      
      @ManyToOne(fetch = FetchType.LAZY)
      public List<MyAnotherEntity> getValues() {
       return values;
      }
      
      
      }
      

      然后,当您选择具有条件的实体时,如果您需要将集合映射到对象,则需要设置获取模式。

      Criteria c = createCreteria(entityManager, MyEntity.class);
      c.setFetchMode("values", FetchMode.JOIN);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-02
        • 1970-01-01
        • 2012-09-05
        • 1970-01-01
        • 2022-12-17
        相关资源
        最近更新 更多