gpt4 book ai didi

hibernate - 控制 hibernate session (何时手动关闭它)

转载 作者:行者123 更新时间:2023-12-03 05:35:30 26 4
gpt4 key购买 nike

我是hibernate新手,在阅读了hibernate api和教程后,似乎 session 在不使用时应该关闭。

像这样:

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

在独立应用程序中使用它时我没有任何疑问。但是我不确定何时在网络应用程序中使用。

例如,我有一个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.
}
}

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

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

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

另外,在 servlet 中使用 session 的线程问题是什么,因为我看到 api 中的 session 不是线程安全的。

最佳答案

I am new in hibernate,after read the hibernate api and tutorial,it seems that the session should cloesd when not used.

完成后应该将其关闭(但正如我们将看到的,这可以自动为您完成)。

I have no question when using it in a standalone application. However I am not sure when using in the web app.

嗯,如 11.1.1. Unit of work 部分所述在文档中,多用户客户端/服务器应用程序中最常见模式是每个请求 session

For example, I have a servlet:TestServlet to recieve the parameters from the client,then I call a Manager to query something according to the parameters: just like this (...) Should I close the session in the query method?

这完全取决于您如何获取 session 。

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

要实现每个请求 session 模式,首选第一种方法(更简单且更简洁)。使用第二种方法来实现long conversations

维基页面Sessions and transactions是对此主题文档的一个很好的补充。

BTW, does the tx.commit() is required each time?

您可能想阅读Non-transactional data access and the auto-commit mode澄清一些事情,但简单地说,您的 Hibernate 代码必须在事务内执行,我建议使用显式事务边界(即显式 beginTransactioncommit).

Also what's the thread problem about using session in servlet, since I saw the session is not thread safe in api.

只要不将其设为 Servlet 的实例变量,就不会有任何问题。

引用文献

关于hibernate - 控制 hibernate session (何时手动关闭它),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4040761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com