Spring + Hibernate会话生命周期

Lai*_*jus 17 java spring hibernate

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

SessionFactory由Spring自动创建,并从Glassfish连接池获取其数据库连接.目前我正在通过Hibernate会话SessionFactory.getCurrentSession().然后我开始交易,完成工作然后commit()rollback()最后.我需要做任何其他操作,如disconnect(),close(),flush()在任何时间或任何其他人,以便连接将被适当地返回到游泳池或就是一切已经自动春天呢?

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

Nan*_*ale 12

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

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

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

我从这个链接获得以下行

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


Ken*_*han 7

关于连接如何释放回连接池的策略与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文档中验证此行为.