什么时候关闭hibernate会话?

时间:2017-04-04 04:45:10

标签: java hibernate

我正在使用动态网络项目。我在服务器启动时打开会话。为此目的,我使用单吨静态类,并在周围的任何地方使用会话。

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

4 个答案:

答案 0 :(得分:4)

Hibernate中有两个Object:

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

长答案:

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

现在进入你的Session,它是轻量级对象,对于你可以创建会话对象的每个事务,当你完成Transaction后你可以关闭session。

答案 1 :(得分:2)

只要您想要连接到数据库,就应该维护会话。

但是会话不是线程安全对象,不能由多个线程共享。所以你应该每个请求使用一个会话。

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

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

  

你知道在哪里可以处理

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

    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会话视图过滤器来自动处理打开和关闭会话。