Java 休眠会话和垃圾收集器

Java 休眠会话和垃圾收集器,java,hibernate,database-connection,Java,Hibernate,Database Connection,垃圾回收时,具有hibernate会话数据成员的对象会话的jdbc连接是否关闭?换句话说,将关闭会话留给垃圾收集器是个坏主意吗?您应该始终明确关闭资源,而不是依赖GC/最终确定。完全同意@Robert。无论如何强调都不过分,hibernate会话对象应该像JDBC连接一样小心对待,您应该知道在任何情况下它何时何地打开,何时何地关闭 这当然是人们认为spring非常有用的原因之一,它提供了一个非常完整的框架来管理资源的生命周期,如jdbc连接和hibernate会话。如果您的实体是垃圾收集的,那么

垃圾回收时,具有hibernate会话数据成员的对象会话的jdbc连接是否关闭?换句话说,将关闭会话留给垃圾收集器是个坏主意吗?

您应该始终明确关闭资源,而不是依赖GC/最终确定。

完全同意@Robert。无论如何强调都不过分,hibernate会话对象应该像JDBC连接一样小心对待,您应该知道在任何情况下它何时何地打开,何时何地关闭


这当然是人们认为spring非常有用的原因之一,它提供了一个非常完整的框架来管理资源的生命周期,如jdbc连接和hibernate会话。

如果您的实体是垃圾收集的,那么也没有理由GC会话。课程将在那时或以后进行GCed

例如,如果我在静态列表中存储对会话的引用,我可以运行应用程序数小时,收集实体,但不会收集会话

会议应明确结束


如果您不喜欢代码中的显式结尾,我完全同意您和其他许多人的看法。:-)

一个常见的解决方案是在框架代码中进行关闭,即编写一次并应用于所有事务的代码。它可能发生在超类中,例如,如果所有事务都是通过命令模式实现的

然而,最常见的实现模式是将AOP用于这样一个全局关注点。我们的项目使用Spring,它为关闭所有hibernate会话(以及相关事务)提供了现成的支持,并为提交/回滚提供了附加功能:

  • 如果抛出异常,则在关闭事务之前对事务调用回滚
  • 否则,将调用commit