ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 11.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环境中,你可以不管是否每次都获得同一个连接的时候,这才是安全的。