【问题标题】:Does beginTransaction in Hibernate allocate a new DB connection?Hibernate 中的 beginTransaction 是否分配新的数据库连接?
【发布时间】:2011-02-02 04:07:37
【问题描述】:

只是想知道在 Hibernate 中开始一个新事务是否实际上分配了一个到数据库的连接?

我担心 b/c 我们的服务器会为收到的每个请求开始一个新事务,即使该请求不与数据库交互。我们将数据库连接视为主要瓶颈,所以我想知道是否应该花时间缩小我的事务范围。

到处搜索,并没有找到一个好的答案。非常简单的代码在这里:

    SessionFactory sessionFactory = (SessionFactory) Context.getContext().getBean("sessionFactory");
    sessionFactory.getCurrentSession().beginTransaction();
    sessionFactory.getCurrentSession().setFlushMode(FlushMode.AUTO);

非常感谢! 一个

【问题讨论】:

    标签: java performance hibernate orm transactions


    【解决方案1】:

    (根据 Pascal Thivent 的评论更新)

    如果需要,每个 Session 都会创建一个数据库连接 - 例如。如果开始交易。仅创建会话就不会打开连接。

    要克服这个问题,您可以使用connecetion pool 以便重复使用连接。或者您可以确保(正如您所做的那样)没有自动启动事务。

    This 讨论只读事务。看看。)

    【讨论】:

    • 谢谢,我们已经在使用连接池了。通过默认不开始事务,我们能够大大减少数据库的负载。
    • 实际上,连接是在Session 中延迟加载的。详情见我的回答。
    • @Pascal Thivent 嗯,有趣且合乎逻辑 :) @illscience 请更改已接受的答案
    【解决方案2】:

    根据 Hibernate 文档的 11.1. Session and transaction scopes 部分:

    SessionFactory 是一个 创建成本高,线程安全 对象,旨在由所有人共享 应用程序线程。它被创建 一次,通常在应用程序启动时, 来自Configuration 实例。

    Session 很便宜, 应该是非线程安全的对象 使用一次然后丢弃: 单个请求、对话或 单个工作单元。 Session 将 未获得 JDBC Connection,或 Datasource,除非需要。 不会消耗任何资源,直到 用过。

    为了减少锁争用 数据库,数据库事务 必须尽可能短。长 数据库事务将阻止 您的应用程序从缩放到 高并发负载。 建议你持有一个数据库 在用户思考期间打开交易 直到工作单元完成的时间 完成。

    现在,回答你的问题:

    • 获得Session不会立即获得连接(连接是延迟加载的)
    • 但调用beginTransaction() 将导致给定Session 的连接负载
    • 后续调用将重用相同的connection

    查看org.hibernate.impl.SessionImpl#beginTransaction() 并通过代码了解更多详细信息。

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 2019-11-15
      • 1970-01-01
      • 2011-07-15
      • 2012-09-12
      • 1970-01-01
      • 2023-02-13
      • 1970-01-01
      • 2017-04-01
      相关资源
      最近更新 更多