Hibernate会话问题

时间:2014-08-05 05:57:00

标签: java hibernate session servlets

  

当你第一次尝试使用会话时,Hibernate会创建一个和   将它附加到您的本地线程。当你提交交易时   session Hibernate将自动关闭会话意味着它   不能重复使用。 - 从site

得到这个引用

这是我的代码的样子,每次我提交交易时我都可以关闭hibernateSession

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

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

3 个答案:

答案 0 :(得分: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会负责处理。

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

答案 1 :(得分:0)

尝试使用.getCurrentSession()代替openSession()

答案 2 :(得分:0)

而不是使用

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

使用

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

要在提交事务时自动关闭会话,请在hibernate配置

中将属性设置为true
hibernate.transaction.auto_close_session=true