【问题标题】:Spring + Hibernate session lifecycleSpring + Hibernate 会话生命周期
【发布时间】:2012-01-04 08:59:37
【问题描述】:

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

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

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

【问题讨论】:

    标签: java spring hibernate


    【解决方案1】:

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

    如果你想检查。如果您正在为您的应用程序使用日志记录,您可以检查日志。会是这样的:

    (main) INFO [AnnotationSessionFactoryBean] 关闭 Hibernate SessionFactory

    我从this link得到以下信息

    这里的主要合约是创建 Session 实例。通常 一个应用程序有一个 SessionFactory 实例和线程 服务客户端请求从该工厂获取 Session 实例。 SessionFactory 的内部状态是不可变的。一旦是 创建了这个内部状态设置。这种内部状态包括所有 关于对象/关系映射的元数据。 实现者必须是线程安全的。

    【讨论】:

    • SessionFactory 在我的系统上配置为单例 bean,因此它永远不会关闭...
    • @Laimoncijus :SessionFactory 默认是单例的。答案相应修改。检查一下
    • 所以,你不需要配置 sessionfactory 单例。还要检查这个答案:stackoverflow.com/questions/8523332/…
    【解决方案2】:

    连接释放回连接池的策略与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()

    您可以在hibernate documentation Section 11.5 中验证此行为。

    【讨论】:

      【解决方案3】:

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

      然后我开始事务,完成工作,然后 commit() 或 rollback() 在最后。我是否需要执行任何其他操作,例如断开连接(), close()、flush() 或任何其他任何时间,以便连接 正确返回池或一切都已经 由 Spring 自动完成?

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

      【讨论】:

        【解决方案4】:

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

        这大部分发生在 AbstractSessionFactoryBean 的实现中。连接的关闭是由 SessionFactoryImpl 类中的 hibernate 使用语句 settings.getConnectionProvider().close(); 完成的。 .总之,hibernate 为你做一切。 Spring 只是在必要时调用它的帮助。

        【讨论】:

          猜你喜欢
          • 2014-12-04
          • 1970-01-01
          • 2017-06-23
          • 2011-08-21
          • 2016-11-21
          • 2014-08-03
          • 2014-08-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多