12.5. 连接释放模式(Connection Release Modes)
Hibernate 关于 JDBC 连接管理的旧(2.x)行为是,
Session
在第一次需要的时候获取一个连接,在 session 关闭之前一直会持有这个连接。Hibernate 引入了连接释放的概念,来告诉 session 如何处理它的 JDBC 连接。注意,下面的讨论只适用于采用配置 ConnectionProvider
来提供连接的情况,用户自己提供的连接与这里的讨论无关。通过 org.hibernate.ConnectionReleaseMode
的不同枚举值来使用不用的释放模式:
ON_CLOSE
:基本上就是上面提到的老式行为。Hibernate session 在第一次需要进行 JDBC 操作的时候获取连接,然后持有它,直到 session 关闭。AFTER_TRANSACTION
:在org.hibernate.Transaction
结束后释放连接。AFTER_STATEMENT
(也被称做积极释放):在每一条语句被执行后就释放连接。但假若语句留下了与 session 相关的资源,那就不会被释放。目前唯一的这种情形就是使用org.hibernate.ScrollableResults
。
hibernate.connection.release_mode
配置参数用来指定使用哪一种释放模式。可能的值有:
auto
(默认):这一选择把释放模式委派给org.hibernate.transaction.TransactionFactory.getDefaultReleaseMode()
方法。对 JTATransactionFactory 来说,它会返回 ConnectionReleaseMode.AFTER_STATEMENT;对 JDBCTransactionFactory 来说,则是 ConnectionReleaseMode.AFTER_TRANSACTION。很少需要修改这一默认行为,因为假若设置不当,就会带来 bug,或者给用户代码带来误导。on_close
:使用 ConnectionReleaseMode.ON_CLOSE。这种方式是为了向下兼容的,但是已经完全不被鼓励使用了。after_transaction
: 使用 ConnectionReleaseMode.AFTER_TRANSACTION。这一设置不应该在 JTA 环境下使用。也要注意,使用 ConnectionReleaseMode.AFTER_TRANSACTION 的时候,假若session 处于 auto-commit 状态,连接会像 AFTER_STATEMENT 那样被释放。after_statement
:使用 ConnectionReleaseMode.AFTER_STATEMENT。除此之外,会查询配置的ConnectionProvider
,是否它支持这一设置(supportsAggressiveRelease()
)。假若不支持,释放模式会被设置为 ConnectionReleaseMode.AFTER_TRANSACTION。只有在你每次调用ConnectionProvider.getConnection()
获取底层 JDBC 连接的时候,都可以确信获得同一个连接的时候,这一设置才是安全的;或者在 auto-commit 环境中,你可以不管是否每次都获得同一个连接的时候,这才是安全的。