java - Hibernate session 问题

标签 java hibernate session servlets

When you first attempt to use a session Hibernate will create one and attach it to your local thread. When you commit the transaction in the session Hibernate will automatically close the session meaning it can’t be reused. - got this quote from this site

这就是我的代码的样子,我可以在每次提交事务时关闭我的 hibernateSession 吗:

Session session = HibernateUtil.getSessionFactory().openSession();
   session.setFlushMode(FlushMode.AUTO);
   session.beginTransaction();
   session.getTransaction().commit();
   session.close();

我的所有代码都工作正常,但存在问题: 例如,如果我将行添加到数据库中,保存成功,如果我在 1-10 秒后添加另一行。发生 Hibernate 异常,表示 session 已关闭。但如果我等待一分钟再添加一个,这种情况就不会发生。这在我的代码中是否有些错误,或者服务器的连接速度很慢(我确实有这个想法,因为我的 java servlet 代码的更新有时会延迟)?有什么想法吗?

最佳答案

只要您需要提交事务,您就打开 session ,这是一件好事,但是:

一般来说,hibernate 会为您管理所有 session 的关闭和打开,因此,如果您需要承担责任,则需要在 hibernate 配置文件中更改以下内容:hibernate.cfg.xml

属性名称: current_session_context_class
属性(property)值(value): 托管

要创建 session 并启动事务,您需要以下代码:

org.hibernate.classic.Session session = HibernateUtil.getSessionFactory().openSession();
session.setFlushMode(FlushMode.MANUAL);
ManagedSessionContext.bind(session);
session.beginTransaction();

要提交事务,请执行以下操作:

ManagedSessionContext.unbind(HibernateUtil.getSessionFactory()); 
session.flush(); 
session.getTransaction().commit(); 
session.close();

您可以 100% 确定,每当您提交时,您都会从线程中取消附加 session ,并且 gc 将处理它。

因此,每当您需要执行另一笔交易时,您都需要再次运行代码的第一部分。

关于java - Hibernate session 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25132024/

相关文章:

java - 如何正确安装mysqlconnecter java?

java - 如何强制子类在重写方法中提供特定数据

java - 正则表达式不起作用,需要一个好的正则表达式来满足以下规则 :

mysql - LocalDate MySQL 持久性返回之前的日期

java - 如何以正确的方式更新生产中的 Hibernate 应用程序?

java - Lambda 表达式和 Optional 如何返回 String 值

java - Hibernate 事务从另一个事务抛出异常

session - 是什么阻止网站 X 读取网站 Y 的 cookie?

session - Drupal session 表变得巨大

php - 使用 ajax 的 Codeigniter session