Java 休眠会话问题
当您第一次尝试使用会话时,Hibernate将创建一个会话并 将其附加到本地线程。当您在中提交事务时 会话休眠将自动关闭会话,这意味着 不能重复使用从这里得到这句话 无论我的代码是什么样子,我都可以在每次提交事务时关闭我的Java 休眠会话问题,java,hibernate,session,servlets,Java,Hibernate,Session,Servlets,当您第一次尝试使用会话时,Hibernate将创建一个会话并 将其附加到本地线程。当您在中提交事务时 会话休眠将自动关闭会话,这意味着 不能重复使用从这里得到这句话 无论我的代码是什么样子,我都可以在每次提交事务时关闭我的hibernateSession: Session session = HibernateUtil.getSessionFactory().openSession(); session.setFlushMode(FlushMode.AUTO); session.be
hibernateSession
:
Session session = HibernateUtil.getSessionFactory().openSession();
session.setFlushMode(FlushMode.AUTO);
session.beginTransaction();
session.getTransaction().commit();
session.close();
我的所有代码都可以正常工作,但有一个问题:
例如,若我将行添加到数据库中,保存成功,若我在1-10秒后添加另一行。发生Hibernate异常,表示会话已关闭。但如果我再添加一个,如果我等待1分钟,这不会发生。这在我的代码中是否有点错误,或者im连接的服务器很慢(我确实有这个想法,因为java servlet代码的更新有时会延迟)?有什么想法吗?您做了一件好事,在需要提交事务时打开一个会话,但是: 通常,hibernate会为您管理所有会话的关闭和打开,因此如果您需要承担责任,则需要在hibernate配置文件中更改以下内容:hibernate.cfg.xml 属性名称:
当前会话上下文类
属性值:
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会处理它
因此,当您需要执行另一个事务时,您需要再次运行代码的第一部分。尝试使用
.getCurrentSession()
而不是openSession()
而不是使用
Session session = HibernateUtil.getSessionFactory().openSession();
使用
若要在提交事务时自动关闭会话,请在hibernate配置中将下面的属性设置为true
hibernate.transaction.auto_close_session=true
这就是为什么,如果我删除
会话.close()代码>,HIbernate异常显示,事务未成功启动
?因为HIbernate似乎已提前提交事务,因为它拥有完全控制权,所以您需要更改配置。。。是的,这也解决了问题,我的代码只在时间元素上工作?比如等待1分钟?我将代码更改为您发布的代码,但什么也没有发生,我仍然需要等待一分钟,以避免出现异常。您是否更改了配置并重新启动了服务器?您可以发布您的hibernate.cfg.xml文件吗?@monty024,我的xml只有以下设置:驱动程序、数据库名、用户名、密码、mySQL方言、,和一个水果类的映射。
hibernate.transaction.auto_close_session=true