【问题标题】:Hibernate session issue休眠会话问题
【发布时间】:2014-08-05 05:57:00
【问题描述】:

当您第一次尝试使用会话时,Hibernate 会创建一个会话并 将其附加到您的本地线程。当您在 session Hibernate 会自动关闭会话意味着它 不能重复使用。 - 从这个site得到这个报价

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

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

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

【问题讨论】:

  • 你能发布你的 hibernate.cfg.xml 文件吗?
  • @monty024,我的 xml 中只有驱动程序、数据库名、用户名、密码、mySQL 方言和 Fruit 类的映射的此设置。

标签: java hibernate session servlets


【解决方案1】:

您在需要提交事务时打开会话是一件好事,但是:

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

属性名称: current_session_context_class
属性值: managed

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

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% 确定,无论何时提交您从线程中取消附加会话,gc 都会处理它。

因此,当您需要进行另一项事务时,您需要再次运行代码的第一部分。

【讨论】:

  • 这就是为什么,如果我删除session.close();,HIbernate 异常会说,transaction not successfully started
  • 因为 hibernate 似乎在事先提交事务,因为它具有完全控制权,所以您需要更改配置...是的
  • 这也解决了我的代码仅在时间元素上工作的问题吗?喜欢等 1 分钟?
  • 我将代码更改为您发布的内容,但没有任何反应,id 仍然需要等待一分钟才能不显示异常
  • 你是否更改了配置并重新启动了服务器?
【解决方案2】:

尝试使用.getCurrentSession() 而不是openSession()

【讨论】:

    【解决方案3】:

    而不是使用

    Session session = HibernateUtil.getSessionFactory().openSession();
    

    使用

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    

    当事务提交时自动关闭会话在你的休眠配置中设置为 true

    hibernate.transaction.auto_close_session=true
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 2017-08-05
      • 2012-06-02
      相关资源
      最近更新 更多