Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠会话问题_Java_Hibernate_Session_Servlets - Fatal编程技术网

Java 休眠会话问题

Java 休眠会话问题,java,hibernate,session,servlets,Java,Hibernate,Session,Servlets,当您第一次尝试使用会话时,Hibernate将创建一个会话并 将其附加到本地线程。当您在中提交事务时 会话休眠将自动关闭会话,这意味着 不能重复使用从这里得到这句话 无论我的代码是什么样子,我都可以在每次提交事务时关闭我的hibernateSession: Session session = HibernateUtil.getSessionFactory().openSession(); session.setFlushMode(FlushMode.AUTO); session.be

当您第一次尝试使用会话时,Hibernate将创建一个会话并 将其附加到本地线程。当您在中提交事务时 会话休眠将自动关闭会话,这意味着 不能重复使用从这里得到这句话

无论我的代码是什么样子,我都可以在每次提交事务时关闭我的
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