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方法返回到它的池。