繁体   English   中英

Spring + Hibernate会话生命周期

[英]Spring + Hibernate session lifecycle

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

SessionFactory由Spring自动创建,并从Glassfish连接池获取其数据库连接。 目前我正通过SessionFactory.getCurrentSession()获得Hibernate会话。 然后我开始事务,完成工作,然后在最后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文档中验证此行为。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM