控制休眠会话(何时手动关闭)

hgu*_*ser 64 session hibernate

我是hibernate的新手,在阅读了hibernate api和教程后,看来会话应该在不使用时关闭.

像这样:

Session sess=getSession();
Transcration tx=sess.beginTranscration();
//do something using teh session
sess.save(obj);
tx.commit();
sess.close;
Run Code Online (Sandbox Code Playgroud)

在独立应用程序中使用它时我毫无疑问.但是我不确定何时在网络应用中使用.

例如,我有一个servlet:TestServlet从客户端接收参数,然后我调用Manager来根据参数查询,就像这样:

class TestServlet{
  doGet(HttpServletRequset,httpServletResponse){
    String para1=request.getParam...();
    String para2=.....
    new Manager().query(para1,para2);
  }
}

class Manager{
  public String query(String pa1,String pa2){
    Session=....// get the session
    //do query using para1 and 1
    session.close() //Here, I wonder if I should close it.
  }
}
Run Code Online (Sandbox Code Playgroud)

我应该在查询方法中关闭会话吗?

因为有人告诉我,hibernate中的会话就像jdbc中的连接一样.那么频繁打开和关闭它是正确的方法吗?

顺便说一句,每次都需要tx.commit()吗?

还有什么是在servlet中使用session的线程问题,因为我看到会话在api中不是线程安全的.

Pas*_*ent 117

我是hibernate的新手,在阅读了hibernate api和教程之后,似乎会话在不使用时应该是cloesd.

它应该在你完成后关闭(但这可以为你自动完成,我们将看到).

在独立应用程序中使用它时我毫无疑问.但是我不确定何时在网络应用中使用.

好吧,正如11.1.1节所述.工作单元的文件,最常见的在多用户的客户机/服务器应用程序模式是会话每个请求.

例如,我有一个servlet:TestServlet来接收来自客户端的参数,然后我调用一个Manager来根据参数查询一些东西:就像这样(...)我应该在查询方法中关闭会话吗?

这一切都取决于你如何获得会话.

  • 如果使用sessionFactory.getCurrentSession(),您将获得一个绑定到事务生命周期的"当前会话",并在事务结束(提交或回滚)时自动刷新和关闭.
  • 如果你决定使用sessionFactory.openSession(),你必须自己管理会话,并"手动"刷新和关闭它.

要实现每个请求会话模式,首选方法(更容易,更简洁).使用第二种方法实现长对话.

维基页面会话和事务是对此主题的文档的一个很好的补充.

顺便说一句,每次都需要tx.commit()吗?

您可能希望阅读非事务性数据访问和自动提交模式以澄清一些事情,但简而言之,您的Hibernate代码必须在事务中执行,我建议使用显式事务边界(即明确beginTransactioncommit).

还有什么是在servlet中使用session的线程问题,因为我看到会话在api中不是线程安全的.

只是不要使它成为Servlet的实例变量,你就不会有任何问题.

参考

  • @hguser:如果您没有使用EJB或Spring,那么请转到HibernateUtils类.不,获取会话并不是一项昂贵的操作,也不是性能问题,它并不比从池中获取连接更糟糕. (5认同)