2012-03-06 43 views
2

大家都知道,Hibernate的引入开销基本在数据库中的所有操作,由于内部缓存的管理和对象的状态。提高性能取与Hibernate

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

,我们知道这种方法是不是真的干净,我们做了一些测试,我们试图微调Hibernate的阅读,但我们所取得的成就是以下几点:

读写时间JDBC(session.doWork) :23号第
读取时间休眠(session.createQuery懒获取):94号

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

此外,如果您有任何其他的想法,有什么可以帮助加快这一准备就绪,我们将感谢。

回答

4

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

这取决于。如果你的数据库是群集或不同的表驻留在位于不同的物理磁盘或机器不同的表空间,并行化可能会加速事情。否则,I/O是瓶颈。

另外,还要确保你的查询被编译一次,重复使用,在数据库服务器解析/编译阶段可能需要一些时间(但由于这部分是CPU限制的其实是可以成功进行并行)。

Hibernate的会话和事务是否被设计为安全地从多个线程使用?

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

此外,如果您有任何其他想法,有什么可以帮助加快这一准备,我们会感激。

  • 使用预处理语句/编译查询,以避免编译开销在DBMS

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

  • 请确保您连接池的配置是否正确

  • 监控GC活动和memomry消费,也许你的Hibernate Session被增长过大?

  • 考虑存储过程,他们往往是在快速的答案快得多

+0

谢谢,但它接缝,我们已经尝试了一切,现在我们仍坚持这一4X开销。 – mario 2012-03-06 12:27:09

+0

@mario:你有没有尝试过分析?但老实说,原始JDBC中的23秒意味着你正在做很多查询,不要指望Hibernate在所有反射/ HQL开销(可能是标准API)或者[批处理](http:// docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html))另外,Hibernate并不是最快的JPA提供者:http://www.jpab.org – 2012-03-06 12:30:51

+0

我们正在阅读很多数据,但只有很少的查询。我的直觉告诉我预计会有2-5倍的开销,我们的成就(4倍)符合预期。我会检查jpab(到目前为止还没有听说过)。谢谢! – mario 2012-03-06 12:42:27