Java Hibernate中的beginTransaction是否分配新的数据库连接?
只是想知道在Hibernate中开始一个新事务是否真的分配了一个到DB的连接 我担心b/c服务器会为收到的每个请求启动一个新的事务,即使该请求不与数据库交互。我们将DB连接视为一个主要瓶颈,因此我想知道是否应该花时间缩小事务的范围 到处找都找不到好答案。下面是非常简单的代码: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
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请更改已接受的答案