春季 + 休眠会话生命周期

2022-09-02 10:15:22

春季休眠会话的“生命周期”应该如何正确完成?

由Spring自动创建,并从Glassfish连接池中获取其数据库连接。目前,我正在通过 获得休眠会话。然后我开始交易,做工作,然后或在最后。我是否需要随时执行任何其他操作,如 、 或任何其他操作,以便将连接正确返回到池中,或者 Spring 是否已经自动完成了所有操作?SessionFactorySessionFactory.getCurrentSession()commit()rollback()disconnect()close()flush()

有了这些方法,我目前有点困惑,无法理解什么时候应该做什么,也许有人可以指出正确的方向?


答案 1

由于SessionFactory是由Spring自动创建的,因此Spring框架将负责关闭连接。查看春季资源管理

如果你想检查。如果对应用使用日志记录,则可以检查日志。它会是这样的:

(主要)INFO [AnnotationSessionFactoryBean] Close Hibernate SessionFactory

我从此链接获得以下行

这里的主要合同是创建会话实例。通常,应用程序具有单个 SessionFactory 实例,并且为客户端请求提供服务的线程从此工厂获取会话实例。会话工厂的内部状态是不可变的。创建后,将设置此内部状态。此内部状态包括有关对象/关系映射的所有元数据。实现者必须是线程安全的。


答案 2

有关如何将连接释放回连接池的策略与 Spring 无关。它由Hibernate本身通过配置参数进行配置,该参数由org.hibernate.ConnectionReleaseMode中的枚举标识。hibernate.connection.release_mode

从版本 3.1+ 开始,缺省值是哪个值取决于是使用 JTA 还是 JDBC 事务。在使用 JDBC 事务的情况下,它被设置为 (即 )。hibernate.connection.release_modeautoConnectionReleaseModeConnectionReleaseMode.AFTER_TRANSACTIONafter_transaction

连接将在每次事务后返回到连接池,即通过调用或,以及调用和ConnectionReleaseMode.AFTER_TRANSACTIONtransaction.commit()transaction.rollback()session.close()session.disconnect()

您可以在休眠文档第 11.5 节中验证此行为。


推荐