【问题标题】:Increase fetch performance with Hibernate使用 Hibernate 提高获取性能
【发布时间】:2012-03-06 12:08:59
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: multithreading performance hibernate fetch


    【解决方案1】:

    如果并行化读取本身可能会有所帮助(我们正在读取很多可以并行执行的表)?

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

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

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

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

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

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

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

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

    • 监控 GC 活动和内存消耗,也许您的 Hibernate 会话增长过大?

    • 考虑存储过程,它们往往更快

    【讨论】:

    • 感谢您的快速回答,但我们似乎已经尝试了所有这些,现在我们被这 4 倍的开销所困扰。
    • @mario:你试过分析吗?但老实说,原始 JDBC 中的 23 秒意味着您正在执行 很多 查询,不要指望 Hibernate 在所有反射/HQL 开销(可能是标准 API?或 batch processing)上会更快Hibernate 也不是最快的 JPA 提供者:jpab.org
    • 我们正在读取大量数据,但只有很少的查询。我的直觉告诉我,预计会有 2-5 倍的开销,而我们的成就 (4x) 符合预期。我会检查 jpab (到目前为止还没有听说过)。谢谢!
    猜你喜欢
    • 2014-02-19
    • 2013-07-23
    • 1970-01-01
    • 2017-05-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多