使用 SessionFactoryUtils 时我应该关闭连接吗

Posted

技术标签:

【中文标题】使用 SessionFactoryUtils 时我应该关闭连接吗【英文标题】:Should I close connection when using SessionFactoryUtils 【发布时间】:2010-08-05 06:41:47 【问题描述】:

如果我想使用 SessionFactoryUtils 直接获取 Connection 执行一些 SQL 语句,并加入同一个事务。 像这样:

SessionFactoryUtils.getDataSource(getSessionFactory()).getConnection();
//some logic after Connection retrieved

我必须自己关闭连接吗?还是就这样吧,Hibernate Session 会为我处理它?

【问题讨论】:

【参考方案1】:

如果我想使用SessionFactoryUtils直接获取Connection来执行一些SQL语句,并加入同一个事务。 (...) 我必须自己关闭Connection 吗?或者就这样,Hibernate Session 会为我处理它?

您在此处直接从池中借用连接,不能保证Session 会获得相同的 IMO。因此,您有责任正确关闭该连接,我建议使用:

SessionFactoryUtils.getDataSource(getSessionFactory()).closeConnection(conn);

如果您想使用由Session 管理的连接,请使用Session#doWork(Work)(这个新的API 取代了旧的Session#connection() 方法,该方法已被弃用并将从Hibernate 4.x 中删除)。在这种情况下,将使用Session 关闭连接。

或者也许只是使用Session#createSQLQuery(String),就像已经建议的那样。

实际上,提供更多上下文信息(您是否在模板中、您是否已经有一个 Session、您会得到一个等)确实有助于找到最佳解决方案(它可能不是选择的那个)。

另见

Colin 在线程中的回答:When using JdbcTemplate, how do I access the connection?

【讨论】:

【参考方案2】:

我认为您需要做的就是正确处理您的会话(即刷新、关闭它,无论您的设置是否有效)。

但是为什么不使用createSQLQuesry Session 的方法而不是直接连接呢?

【讨论】:

以上是关于使用 SessionFactoryUtils 时我应该关闭连接吗的主要内容,如果未能解决你的问题,请参考以下文章

getSession() 和 getNewSession() 的区别

hibernate主键生成策略

为啥使用委托时我的 collectionView 为零?

使用 UIScrollView 时我无法触摸图像

当会话令牌无效时我应该使用啥状态码?

使用 API 时我在这里做错了啥?