我们使用 Hibernate 作为 MySQL 数据库之上的 ORM 层。我们有很多模型对象,其中一些非常大(就字段数量等而言)。我们的一些查询需要从数据库中检索大量(如果不是全部)模型对象,以对它们进行各种计算。
我们启用了延迟加载,但在某些情况下,Hibernate 仍然需要大量时间来填充对象。MySQL 查询的执行时间非常快(大约几毫秒),但是 Hibernate 会花时间填充对象。
有什么方法/模式/优化来加速这个过程吗?
谢谢。
我们使用 Hibernate 作为 MySQL 数据库之上的 ORM 层。我们有很多模型对象,其中一些非常大(就字段数量等而言)。我们的一些查询需要从数据库中检索大量(如果不是全部)模型对象,以对它们进行各种计算。
我们启用了延迟加载,但在某些情况下,Hibernate 仍然需要大量时间来填充对象。MySQL 查询的执行时间非常快(大约几毫秒),但是 Hibernate 会花时间填充对象。
有什么方法/模式/优化来加速这个过程吗?
谢谢。
一种方法是不填充实体,而是填充某种视图对象。
假设 CustomerView 有适当的构造函数,你可以做
select new CustomerView(c.firstname, c.lastname, c.age) from Customer c
尽管我对 Hibernate 填充对象的速度很慢感到有些惊讶,除非您碰巧通过级联加载关联的对象并忘记了一些适当的提取。
也许考虑添加二级缓存?这不一定会加速对象实例化,但它可以大大降低您需要这样做的频率。
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html
由于您要问的是与性能相关的问题,因此您可能希望收集更多关于瓶颈所在位置的数据。你说
Hibernate 会花时间填充对象。
你怎么知道问题出在 Hibernate 上?换句话说,是 Hibernate 本身的问题,还是没有足够的内存(或太多)导致 JVM 无法高效运行?
另外,你提到
我们有很多模型对象,其中一些非常大(就字段数量等而言)。
有多少是“相当大”?许多?数百?数千?它有很大的不同,因为关系数据库(例如 MySQL)随着表变得“更宽”而开始表现更差(请参阅这个问题:如果表中的列太多,性能会降低吗?)。
性能很大程度上与平衡约束有关,但它也涉及收集大量数据以查看问题所在,然后解决该问题。然后你会找到下一个瓶颈并修复它,直到你的性能足够好,或者你用完了实施时间。