gpt4 book ai didi

multithreading - 使用 Hibernate 提高获取性能

转载 作者:行者123 更新时间:2023-12-03 12:52:43 25 4
gpt4 key购买 nike

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

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

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

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

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

此外,如果您有任何其他想法,可以帮助加快准备工作,我们将不胜感激。

最佳答案

if parallelizing the read itself could be of any help (we are reading a lot of tables which we could do in parallel)?



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

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

Are Hibernate's session and transaction designed to be used from multiple threads safely?



绝对不。 Hibernate 中的 session 和事务本质上绑定(bind)到数据库连接。并且连接是单线程的。

Also, if you have any other idea, what could help to speed up this ready, we would be thankful.


  • 使用准备好的语句/编译查询来避免 DBMS 中的编译开销
  • 在 Hibernate 中试验 L2 和查询缓存
  • 确保您的连接池配置正确
  • 监控 GC 事件和内存消耗,也许你的 Hibernate session 变得太大了?
  • 考虑存储过程,它们往往更快
  • 关于multithreading - 使用 Hibernate 提高获取性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9583429/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com