2017-04-04 76 views
0

我正在使用动态Web项目。服务器启动时我打开会话。我为此使用了一个单独的静态类,并在各处使用该会话。何时关闭休眠会话?

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

回答

1

有两个对象在Hibernate中:

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

龙答:

的SessionFactory负责创建与数据库的连接和管理其他的东西,所以创建SessionFactory开始耗时的任务。 所以我会说只有一个sessionFactory对象应该为每个应用程序创建,或者更好的方式是每个数据库一个SeesionFactory。

现在来到您的会话中,它是轻量级对象,对于每个事务您都可以创建会话对象,当您完成事务时,您可以关闭会话。

0

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

1

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

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

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

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

你知道在哪里可以把它处理

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

+0

Java SE 7及更高版本中的@ScaryWombat –

0

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

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