使用Java Hibernate进行会话管理

Oha*_*pan 9 java hibernate

我有一个基于Hibernate的平台,由无状态servlet构建(一个用于注册用户,其余用于查询数据库).

我正在使用Hibernate的会话如下:

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
if ((null == session) || (session.isOpen() == false)) {
  session = HibernateUtil.getSessionFactory().openSession();
}
Run Code Online (Sandbox Code Playgroud)

目前我没有关闭servlet末尾的会话以避免openSession()调用(如果可能,尝试使用打开的会话).

什么是最佳做法?什么时候我应该关闭这些会议?

你能举个例子吗?

提前致谢 !

Boz*_*zho 16

在大多数情况下,最佳做法是按请求进行会话.也就是说,在处理请求的开始时打开一个会话,最后将其关闭.例如,您可以在Servlet中执行此操作Filter.

对整个应用程序进行一次会话是不好的,因为它会在其第一级缓存中累积许多实体,这是内存泄漏.当多个客户端同时使用它时,它也可能产生不确定的结果.

但是,您的代码没有为整个应用程序使用一个会话 - 它使用"当前会话"概念,该概念打开会话并将其存储在上下文中(ThreadLocal例如).但如果你不关闭它,它将永远留在那里.此外,它将导致与上述相同的问题,因为线程在Web应用程序中重用,并且新请求将在某个时刻获得旧的,未闭合的会话.


Saj*_*ran 5

最好为每个请求打开一个新会话,并在处理完请求后关闭该会话。喜欢

Session session = HibernateUtil.getSessionFactory().openSession();
Run Code Online (Sandbox Code Playgroud)

代替

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Run Code Online (Sandbox Code Playgroud)

如果我们使用getCurrentSession()方法,则tansaction.commit()/ rollback()将关闭连接。