使用Hibernate提高获取性能

时间:2012-03-06 12:09:00

标签: multithreading performance hibernate fetch

众所周知,由于管理内部缓存和对象状态,Hibernate基本上会对数据库上的所有操作产生开销。

我们目前在我们的应用程序中使用的是使用纯SQL(JDBC)读取数据并使用Hibernate进行保存和更新。原因是我们需要在每次计算中加载大量信息,但只更新有限的部分。

现在,我们知道这种方法并不是最干净的,我们做了一些测试,我们试图微调Hibernate的读数,但我们取得的成就如下:

读取时间JDBC(session.doWork):23 s 读取时间Hibernate(session.createQuery with lazy fetch):94 s

在我们看来,现有的开销是由于Hibernate的额外处理,我们想知道并行读取本身是否有任何帮助(我们正在阅读很多可以并行执行的表)? Hibernate的会话和事务是否设计为可以安全地从多个线程使用?

另外,如果您有任何其他想法,有什么可以帮助加快准备,我们将非常感激。

1 个答案:

答案 0 :(得分:4)

  

如果并行化读取本身可能有任何帮助(我们正在阅读许多我们可以并行执行的表格)?

这取决于。如果您的数据库是群集的,或者不同的表驻留在位于不同物理磁盘或计算机上的不同表空间中,则并行化可能会加快速度。否则I / O就是瓶颈。

还要确保您的查询被编译一次并重用,数据库服务器中的解析/编译阶段可能需要一些时间(但实际上可以成功并行化,因为这部分是受CPU限制的。)

  

Hibernate的会话和事务是否可以安全地从多个线程中使用?

绝对不是。 Hibernate中的会话和事务本质上绑定到数据库连接。连接是单线程的。

  

另外,如果您有任何其他想法,有什么可以帮助加快准备,我们将非常感激。

  • 使用预准备语句/编译查询来避免DBMS中的编译开销

  • 在Hibernate中试验L2和查询缓存

  • 确保您的连接池配置正确

  • 监控GC活动和memomry消耗,也许你的Hibernate会话变得太大了?

  • 考虑存储过程,它们往往要快得多