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

ill*_*nce 13 java performance orm hibernate transactions

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

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

到处搜索,但未能找到一个好的答案.非常简单的代码在这里:

    SessionFactory sessionFactory = (SessionFactory) Context.getContext().getBean("sessionFactory");
    sessionFactory.getCurrentSession().beginTransaction();
    sessionFactory.getCurrentSession().setFlushMode(FlushMode.AUTO);
Run Code Online (Sandbox Code Playgroud)

非常感谢!一个

Pas*_*ent 16

根据第11.1.Hibernate文档的会话和事务范围:

A SessionFactory是一个昂贵的创建线程安全对象,旨在由所有应用程序线程共享.它通常在应用程序启动时从Configuration实例创建一次.

A Session是一种廉价的,非线程安全的对象,应该使用一次,然后丢弃用于:单个请求,对话或单个工作单元.除非需要,否则A Session不会获得JDBC Connection或a Datasource.在使用之前它不会消耗任何资源.

为了减少数据库中的锁争用,数据库事务必须尽可能短.长数据库事务将阻止您的应用程序扩展到高度并发的负载.建议您在用户思考期间保持数据库事务处于打开状态,直到工作单元完成.

现在,回答你的问题:

  • 得到一个Session确实没有立即获得连接(连接是延迟加载)
  • 但是调用beginTransaction()会导致给定的连接负载Session
  • 后续调用将重用相同的内容 connection

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


Boz*_*zho 8

(根据Pascal Thivent的评论更新)

Session如果需要,每个都创建一个数据库连接 - 例如,如果事务已启动.仅仅创建会话就不会打开连接.

要解决此问题,您可以使用连接以便重用连接.或者您可以确保(如您所见)没有自动启动任何交易.

(讨论了只读事务.看看.)