只是想知道在Hibernate中开始新事务是否实际分配了与数据库的连接?
我关心b / c我们的服务器为每个收到的请求开始一个新的事务,即使该请求没有与DB交互。我们看到数据库连接是一个主要的瓶颈,所以我想知道是否应该花时间缩小我的交易范围。
到处搜索,但未能找到一个好的答案。非常简单的代码在这里:
SessionFactory sessionFactory = (SessionFactory) Context.getContext().getBean("sessionFactory");
sessionFactory.getCurrentSession().beginTransaction();
sessionFactory.getCurrentSession().setFlushMode(FlushMode.AUTO);
非常感谢!
一个
答案 0 :(得分:16)
根据Hibernate文档的11.1. Session and transaction scopes部分:
SessionFactory
是一个 昂贵的创造,线程安全 对象,旨在由所有人共享 应用程序线程它被创造了 一次,通常在应用程序启动时, 来自Configuration
个实例。
Session
便宜, 应该是非线程安全的对象 使用一次然后丢弃:a 单个请求,对话或 单一工作单位。 ASession
会 没有获得JDBCConnection
或者Datasource
,除非需要。它 不会消耗任何资源,直到 使用为了减少锁争用 数据库,数据库事务 必须尽可能短。长 数据库事务会阻止 你的应用程序从缩放到 高度并发负载。事实并非如此 建议您持有数据库 在用户思考期间交易开放 直到工作单位的时间 完整。
现在,回答你的问题:
Session
不会立即获得连接(连接延迟加载)beginTransaction()
会导致给定Session
connection
查看org.hibernate.impl.SessionImpl#beginTransaction()
并查看代码以获取更多详细信息。
答案 1 :(得分:8)
(根据Pascal Thivent的评论更新)
如果需要,每个Session
都会创建一个数据库连接 - 例如如果交易已开始。仅仅创建会话就不会打开连接。
要解决此问题,您可以使用connecetion pool以便重复使用连接。或者您可以确保(如您所见)没有自动启动任何交易。
(This讨论了只读事务。看看。)