我正在使用动态网络项目。我在服务器启动时打开会话。为此目的,我使用单吨静态类,并在周围的任何地方使用会话。
但我不确定何时结束会议。你知道它可以在哪里处理吗?什么是最佳做法?
答案 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会话视图过滤器来自动处理打开和关闭会话。