控制hibernate会话(何时手动关闭它)
我是hibernate的新手,在阅读了hibernateapi和教程之后,似乎该会话在不使用时应关闭。
像这样:
Session sess=getSession();Transcration tx=sess.beginTranscration();
//do something using teh session
sess.save(obj);
tx.commit();
sess.close;
在独立应用程序中使用它时,我没有问题。但是我不确定在Web应用程序中使用时。
例如,我有一个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.
}
}
我应该使用查询方法关闭会话吗?
由于有人告诉我,hibernate中的会话就像jdbc中的连接一样。那么,如此频繁地打开和关闭它是正确的方法吗?
顺便说一句,是否每次都需要tx.commit()?
另外,关于在servlet中使用会话的线程问题是什么,因为我看到该会话在api中不是线程安全的。
回答:
我是hibernate的新手,在阅读了hibernateapi和教程之后,似乎该会话在不使用时应该关闭。
完成后应将其关闭(但我们会自动为您完成此操作)。
在独立应用程序中使用它时,我没有问题。但是我不确定在Web应用程序中使用时。
好吧,如第11.1.1节所述。工作单元,文档的 所述 在多用户的客户机/服务器应用程序模式是 。
例如,我有一个Servlet:TestServlet来从客户端接收参数,然后我调用Manager来根据参数查询某些内容:就像这样(…)我应该在查询方法中关闭会话吗?
这完全取决于您如何获得会话。
- 如果使用
sessionFactory.getCurrentSession()
,则将获得绑定到事务生命周期的“当前会话”,并且在事务结束(提交或回滚)时将自动刷新并关闭该会话。 - 如果决定使用
sessionFactory.openSession()
,则必须自己管理会话并“手动”刷新并关闭它。
要实现 每个请求 的 会话 模式,请首选第一种方法(更容易,更不冗长)。使用第二种方法来实现
长时间的对话 。
Wiki页面的会话和事务是该主题文档的很好的补充。
顺便说一句,是否每次都需要tx.commit()?
您可能想阅读非事务性数据访问和自动提交模式以澄清一些事情,但是简单地说,您的Hibernate代码必须在事务内执行,因此我建议使用显式的事务边界(即显式beginTransaction
和commit
)。
另外,关于在servlet中使用会话的线程问题是什么,因为我看到该会话在api中不是线程安全的。
只需不要使其成为Servlet的实例变量,就不会有任何问题。
参考文献
- Hibernate Core 3.3参考指南
- 第11章事务和并发
- hibernateWiki
- 会议和交易
- 非事务数据访问和自动提交模式
以上是 控制hibernate会话(何时手动关闭它) 的全部内容, 来源链接: utcz.com/qa/402078.html