【问题标题】:Close Opened Hibernation sessions if exist关闭打开的休眠会话(如果存在)
【发布时间】:2011-12-15 16:27:39
【问题描述】:

当 Hibernate 会话打开 (sessionFactory.openSession()) 时,它可能会关闭。没关系。如果错过了关闭用于检索数据(而不是保存或更新或删除)应用程序中任何位置的打开会话,如果存在,如何关闭打开的会话?

(假设当JFrame 关闭时,如果有可用的已打开会话,则必须关闭它们。关闭会话可以通过逐个检查代码来完成,但我的意思是,不检查代码,是有什么方法可以关闭一些代码错过的会话)。

【问题讨论】:

    标签: java hibernate swing


    【解决方案1】:

    数据库操作完成后为什么不关闭会话? 我的意思是,在 DAO 类中,您打开会话执行数据库操作。在 finally 块中,关闭您的会话。 您可以像这样关闭会话:

    finally {
       if(session!=null){
          session.close();
       }
    }
    

    您可以使用获取当前会话

    Session sess = sessionFactory.getCurrentSession();
    

    并在 JFrame 的关闭事件上关闭会话。

    我从this link 得到以下信息

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

    我们有责任在完成操作或事务后关闭会话。当我们关闭 sessionfactory 时,所有资源(连接池等)都会正确释放。

    【讨论】:

    • 非常感谢您的回答。我的意思是,如果关闭会话被遗忘为错误,并且在应用程序运行时存在更多打开的会话,则可能会发生内存浪费。在这种情况下,如何关闭或查看是否打开了任何会话?
    • 你能举个例子吗(我无法想象)?
    • Session s=sessionFactory.openSession(); List list=s.createCritaria... .list(); 如果忘记关闭此会话's'。(没有代码: s.close(); )可以说,此获取列表执行更多次,然后是一个新会话是打开的。然后每次执行上述代码时,都会开始一个新的会话,但不会关闭。然后可能存在越来越多的打开会话。最后可能是jvm内存过载的原因。不是吗?如果存在,我想关闭打开的会话。感谢您的关注
    • 所以阿什,我已经相应地编辑了上面的答案。由于我们有单个 Sessionfactory 用于应用程序,我们将拥有与应用程序关联的所有会话,我们可以关闭它们。我不确定,但我阅读并得出结论。
    • 谢谢。我试图关闭从sessionFactory.getCurrentSession();获取的会话。然后有一个异常说没有会话打开。但是已经打开了一个没有关闭的会话。我想我们最好检查我们的代码两次检查打开的会话。
    猜你喜欢
    • 2016-05-17
    • 2012-03-10
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    相关资源
    最近更新 更多