我是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和c3p0作为ORM。但是,当我关闭会话工厂时,连接池不会自行关闭!这是我的应用程序中 唯一 可以进行会话操作的地方。 这是我的配置文件 请注意,空闲连接非常短的原因是它是我尚未通过集成测试的唯一方法。他们经常打开和关闭会话工厂,因此我总是用尽所有连接。正如我们在项目开始时一样,从长远来看,我认为这不是一个非常可持续的策略。 需要注意的“有趣
我有下面的方法,每隔几秒钟插入一大批记录。运行一段时间后,我得到如下错误: 错误:通信链接失败 从服务器成功接收的最后一个数据包是523毫秒前。上次成功发送到服务器的数据包是8毫秒前。 May 16, 2013 9:48:30 AM com.mchange.v2.c3p0.stmt.GooGooStatementCache checkinStatement INFO: 签入语句问题,丢弃。 com
问题内容: 这些方法之间有什么区别,哪种更好?到现在为止,我的代码如下: 但是在运行上述代码时,记录并不总是被删除(精确地:id = 1永远不会被删除,而其他id总是被删除)。我读到保持打开的会话可以稍微加快应用程序的速度- 这就是为什么我要共享会话对象。我的业务对象通过DI获取会话工厂: 问题答案: 根据我在Hibernate的经验,得出的结论是,最好的策略是使Hibernate会话寿命与单个事
大家好,正在使用Spring+JPA/Hibernate+Maven并尝试从DB获取记录。所以当我朗姆酒时,我的应用程序会出现如下错误 这是一段代码
问题内容: 我想知道如果不手动关闭流,何时关闭。我的意思是,如果引用的范围不再存在,流将被关闭吗? 请考虑以下示例方案。 在这里,一旦完成流处理,我将退出,但是反过来将继续执行该程序的程序不会终止,而是继续进行其他操作。 我没有关闭溪流。一旦对A类的引用范围结束,它会自动关闭吗?(即何时结束)?GC会照顾吗?另外,我读到,一旦流程结束,流将关闭,并且系统释放为其他进程保留的所有资源。我们如何检查流
问题内容: 遵循我们在如何在MySQL中关闭sqlalchemy连接中的注释之后,我正在检查SQLAlchemy创建到数据库中的连接,如果不退出Python,我将无法关闭它们。 如果我在python控制台中运行此代码,它将保持会话打开状态,直到我退出python为止: 我发现要关闭它的唯一解决方法是在最后调用。 根据我上面给出的链接中的评论,我的问题现在是: 为什么需要关闭会议? 还不够吗 问题答