【问题标题】:Speeding up Hibernate Object creation?加速 Hibernate 对象的创建?
【发布时间】:2011-09-07 14:54:57
【问题描述】:

我们使用 Hibernate 作为 MySQL 数据库之上的 ORM 层。我们有很多模型对象,其中一些非常大(就字段数量等而言)。我们的一些查询需要从数据库中检索大量(如果不是全部)模型对象,以便对它们进行各种计算。

我们启用了延迟加载,但在某些情况下,Hibernate 仍然需要大量时间来填充对象。 MySQL 查询的执行时间非常快(大约几毫秒),但是 Hibernate 会花时间填充对象。

有没有什么方法/模式/优化来加速这个过程?

谢谢。

【问题讨论】:

    标签: mysql hibernate object-construction


    【解决方案1】:

    由于您要问的是与性能相关的问题,因此您可能希望收集更多关于瓶颈所在位置的数据。你说

    Hibernate 会花时间填充对象。

    你怎么知道问题出在 Hibernate 上?换句话说,是 Hibernate 本身的问题,还是没有足够的内存(或太多)导致 JVM 无法高效运行?

    另外,你提到

    我们有很多模型对象,其中一些非常大(就字段数量等而言)。

    “相当大”有多少?许多?数百?数千?这有很大的不同,因为随着表变得“更宽”,关系数据库(例如 MySQL)开始表现更差(请参阅这个问题:Is there a performance decrease if there are too many columns in a table?)。

    性能在很大程度上与平衡约束有关,但它也涉及收集大量数据以查看问题所在,然后解决问题。然后你会找到下一个瓶颈并修复它,直到你的性能足够好,或者你的实施时间用完了。

    【讨论】:

    • 1) 是的,Hibernate 需要时间从数据库创建对象。我通过探查器运行它,如果我选择显式字段(而不是对象),它也可以正常工作。 2)我实际上不再在公司工作了,但如果我没记错的话,大约有数百人。我认为他们中的任何一个的字段都不会超过大约 30 到 40 个。大约 90% 的人只有大约 10 个。
    • 我很惊讶 Hibernate 需要这么长时间来创建对象(当然,你没有提到“大量时间”到底有多长?)。是在对象的实例化中,还是在等待数据库的结果,或填充对象的字段?我有一个带有更大对象的系统,它们根本不需要太多时间。但我猜你已经不在了,所以没关系。 :-)
    【解决方案2】:

    也许考虑添加二级缓存?这不一定会加快对象实例化的速度,但可以大大降低您需要这样做的频率。

    http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html

    【讨论】:

      【解决方案3】:

      一种方法是不填充实体,而是填充某种视图对象。

      假设 CustomerView 有适当的构造函数,你可以这样做

      select new CustomerView(c.firstname, c.lastname, c.age) from Customer c
      

      虽然我对 Hibernate 填充对象的速度很慢感到有点惊讶,除非您碰巧通过级联加载关联的对象并忘记了一些适当的提取。

      【讨论】:

      • 目前创建视图并不是一个真正的选择。我们有大量的模型,没有时间进行如此紧张的重构过程。一直希望能速战速决。但是,谢谢,将来一定要记住一些事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 2011-07-22
      • 2020-08-20
      • 2020-04-21
      • 2014-02-18
      相关资源
      最近更新 更多