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

时间:2010-03-29 18:18:40

标签: java performance hibernate orm transactions

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

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

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

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

2 个答案:

答案 0 :(得分:16)

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

  

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

     

Session便宜,   应该是非线程安全的对象   使用一次然后丢弃:a   单个请求,对话或   单一工作单位。 A Session会   没有获得JDBC Connection或者   Datasource,除非需要。它   不会消耗任何资源,直到   使用

     

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

现在,回答你的问题:

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

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

答案 1 :(得分:8)

(根据Pascal Thivent的评论更新)

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

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

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