Java Hibernate中的beginTransaction是否分配新的数据库连接?

Java Hibernate中的beginTransaction是否分配新的数据库连接?,java,performance,hibernate,orm,transactions,Java,Performance,Hibernate,Orm,Transactions,只是想知道在Hibernate中开始一个新事务是否真的分配了一个到DB的连接 我担心b/c服务器会为收到的每个请求启动一个新的事务,即使该请求不与数据库交互。我们将DB连接视为一个主要瓶颈,因此我想知道是否应该花时间缩小事务的范围 到处找都找不到好答案。下面是非常简单的代码: SessionFactory sessionFactory = (SessionFactory) Context.getContext().getBean("sessionFactory"); sessio

只是想知道在Hibernate中开始一个新事务是否真的分配了一个到DB的连接

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

到处找都找不到好答案。下面是非常简单的代码:

    SessionFactory sessionFactory = (SessionFactory) Context.getContext().getBean("sessionFactory");
    sessionFactory.getCurrentSession().beginTransaction();
    sessionFactory.getCurrentSession().setFlushMode(FlushMode.AUTO);
非常感谢! a

(根据Pascal Thivent的评论更新)

如果需要,每个
会话
都会创建一个数据库连接,例如事务启动时。仅仅创建会话并不能打开连接

为了克服这个问题,您可以使用一个可重用的连接。或者,您可以确保(看起来您这样做了)没有自动启动任何事务

(讨论只读事务。请查看。)

根据Hibernate文档的一节:

SessionFactory
是一个 创建成本高,线程安全 对象,打算由所有人共享 应用程序线程。它是被创造出来的 一次,通常在应用程序启动时, 从
配置
实例

会话
是一种廉价的, 应为的非线程安全对象 使用一次,然后丢弃:a 单个请求、对话或 单一工作单元A
会话
将 未获得JDBC
连接
,或
数据源
,除非需要。
将不会消耗任何资源,直到 用过

以减少中的锁争用 数据库,一个数据库事务 必须尽可能短。长的 数据库事务将阻止 您的应用程序从扩展到 高度并发加载。不是 建议您持有一个数据库 用户思考期间打开的事务 工作单元完成之前的时间 完成

现在,回答你的问题:

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

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

谢谢,我们已经在使用连接池了。通过默认情况下不启动事务,我们可以大大减少数据库的负载。实际上,连接是在
会话中延迟加载的。有关详细信息,请参阅我的答案。@Pascal Thivent hm,有趣且符合逻辑:)@illscience请更改已接受的答案