众所周知,由于管理内部缓存和对象状态,Hibernate基本上会对数据库上的所有操作产生开销。
我们目前在我们的应用程序中使用的是使用纯SQL(JDBC)读取数据并使用Hibernate进行保存和更新。原因是我们需要在每次计算中加载大量信息,但只更新有限的部分。
现在,我们知道这种方法并不是最干净的,我们做了一些测试,我们试图微调Hibernate的读数,但我们取得的成就如下:
读取时间JDBC(session.doWork):23 s 读取时间Hibernate(session.createQuery with lazy fetch):94 s
在我们看来,现有的开销是由于Hibernate的额外处理,我们想知道并行读取本身是否有任何帮助(我们正在阅读很多可以并行执行的表)? Hibernate的会话和事务是否设计为可以安全地从多个线程使用?
另外,如果您有任何其他想法,有什么可以帮助加快准备,我们将非常感激。
答案 0 :(得分:4)
如果并行化读取本身可能有任何帮助(我们正在阅读许多我们可以并行执行的表格)?
这取决于。如果您的数据库是群集的,或者不同的表驻留在位于不同物理磁盘或计算机上的不同表空间中,则并行化可能会加快速度。否则I / O就是瓶颈。
还要确保您的查询被编译一次并重用,数据库服务器中的解析/编译阶段可能需要一些时间(但实际上可以成功并行化,因为这部分是受CPU限制的。)
Hibernate的会话和事务是否可以安全地从多个线程中使用?
绝对不是。 Hibernate中的会话和事务本质上绑定到数据库连接。连接是单线程的。
另外,如果您有任何其他想法,有什么可以帮助加快准备,我们将非常感激。
使用预准备语句/编译查询来避免DBMS中的编译开销
在Hibernate中试验L2和查询缓存
确保您的连接池配置正确
监控GC活动和memomry消耗,也许你的Hibernate会话变得太大了?
考虑存储过程,它们往往要快得多