何时关闭休眠会话?
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 会话视图过滤器以自动处理打开和关闭会话。
【讨论】:
以上是关于何时关闭休眠会话?的主要内容,如果未能解决你的问题,请参考以下文章