Spring + Hibernate会话生命周期

应该如何正确地完成Spring下Hibernate会话的“生命周期”?

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

有了很多这些方法,我现在有点困惑,要了解应该做什么,也许有人可以指向正确的方向?

由于SessionFactory是由Spring自动创建的,因此Spring框架将负责关闭连接。 查看Spring Resource Management

如果你想检查。 如果您正在使用应用程序的日志记录,则可以检查日志。 它会像:

(主要)INFO [AnnotationSessionFactoryBean]关闭Hibernate SessionFactory

我从这个链接得到以下几行

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

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

从版本3.1+开始, hibernate.connection.release_mode的默认值为auto ,相应的ConnectionReleaseMode值取决于是使用JTA还是JDBC事务。 如果使用JDBC事务,则将其设置为ConnectionReleaseMode.AFTER_TRANSACTION (即after_transaction )。

ConnectionReleaseMode.AFTER_TRANSACTION的行为是:在每次事务之后,连接将返回到连接池,即通过调用transaction.commit()transaction.rollback() ,以及调用session.close()session.disconnect()

您可以在第11.5节的hibernate文档中validation此行为。

当您通过SessionFactory.getCurrentSession()执行hibernate查询时,Spring执行打开和关闭连接的必要任务。 您在spring配置中使用的SessionFactory也在内部调用config.buildSessionFactory方法。

大多数情况发生在AbstractSessionFactoryBean的实现中。 连接的关闭是通过SessionFactoryImpl类中的hibernate使用语句settings.getConnectionProvider()。close();来完成的。 。 简而言之,hibernate为您做了一切。 Spring会在必要时调用它的帮助。

希望此链接将指导您有关会话和交易的信息。

然后我开始事务,完成工作,然后在最后调用commit()或rollback()。 我是否需要随时执行任何其他操作,例如disconnect(),close(),flush()或任何其他操作,以便将连接正确地返回到池中,或者Spring已经自动完成了所有操作?

当您在Transaction上调用commit()时,它将自动关闭会话,最终会在连接上调用close方法返回到它的池。