加速Hibernate对象的创建?

时间:2011-06-03 07:13:27

标签: mysql hibernate object-construction

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

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

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

感谢。

3 个答案:

答案 0 :(得分:2)

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

假设CustomerView具有适当的构造函数,则可以执行

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

  

Hibernate花了很多时间来填充对象。

你怎么知道这是Hibernate的问题?换句话说,Hibernate本身是问题,还是没有足够的内存(或太多)以至于JVM没有高效运行?

另外,你提到

  

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

有多少“相当大”?许多?数百?成千上万的?它产生了很大的不同,因为关系数据库(例如MySQL)在表格变得“更宽”时开始表现得更差(参见这个问题:Is there a performance decrease if there are too many columns in a table?)。

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