何时关闭休眠会话?

Posted

技术标签:

【中文标题】何时关闭休眠会话?【英文标题】:When to close hibernate session? 【发布时间】:2017-04-04 04:45:10 【问题描述】:

我正在使用动态网络项目。我在服务器启动时打开会话。为此,我使用了一个单吨静态类,并在各处使用会话。

但我不确定何时关闭会话。你知道在哪里可以处理吗?最佳做法是什么?

【问题讨论】:

【参考方案1】:

Hibernate 中有两个 Object:

Short Answer : 
SessionFactory : Heavy Weight.
Session : light weight.

长答案:

SessionFactory 负责创建与数据库的连接并管理其他内容,因此创建 sessionFactory 是一项耗时的任务。 所以我会说每个应用程序只应该创建一个 sessionFactory 对象,或者更好的方式是每个数据库创建一个 SeesionFactory。

现在来到你的 Session,它是一个轻量级对象,你可以为每个事务创建会话对象,当你完成事务后你可以关闭会话。

【讨论】:

【参考方案2】:

只要你想连接到你的数据库,你就应该保持你的会话。

但是会话不是线程安全的对象,不能被多个线程共享。因此,您应该为每个请求使用一个会话。

所以底线是,如果您使用的是单线程应用程序,那么最好为整个应用程序使用一个会话。您可以为此使用SessionFactory.getCurrentSession()

但如果您的应用程序在多个线程之间共享,那么您应该始终使用SessionFactory.openSession() 打开新会话。虽然这比前者慢,但它是线程安全的。

你知道在哪里可以处理

最佳做法是在finally 块中关闭它们。但是,如果您使用的是 Java SE 7 及更高版本,那么您也可以在 try-with-resources 中处理它们。

【讨论】:

@ScaryWombat 在 Java SE 7 及更高版本中【参考方案3】:

当事务关闭时应该关闭休眠会话。每个请求一个会话是最好的方法。会话不是线程安全的

【讨论】:

【参考方案4】:

您可以将休眠配置为自动打开和关闭会话,不需要手动关闭。如果您想手动打开和关闭,请打开会话,执行查询并关闭会话:

    Transaction tx = session.beginTransaction();
    try 
        for (int i = 0; i < mesages.size(); i++) 
            Message message = messages.get(i);
            session.save(message);
            if (i % 75 == 0)  
                // flush a batch of inserts and release memory:
                session.flush();
                session.clear();
            
        
        tx.commit();
    catch (Exception e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
        tx.rollBack();
    finally
        session.close();
    

以上代码问题链接:How to properly close and open a Hibernate session?

您也可以搜索 Hibernate 会话视图过滤器以自动处理打开和关闭会话。

【讨论】:

以上是关于何时关闭休眠会话?的主要内容,如果未能解决你的问题,请参考以下文章

无法为事务打开休眠会话/无法打开连接 [关闭]

带有 2 个数据库的休眠随机“会话已关闭错误”

Spring Boot 如何处理 Hibernate 会话?

从应用程序获取休眠会话计数

使用休眠检查数据库表中某些记录的最快方法[关闭]

休眠“在视图中打开会话”和异步任务