Java 在不同线程中休眠断言失败

Java 在不同线程中休眠断言失败,java,multithreading,hibernate,assertions,Java,Multithreading,Hibernate,Assertions,我用一个会话连接到数据库。在我的整个课程中,我总是在同一节课上。我的线程“1”捕获数据库中的主要数据。必须允许用户取消此线程。因此,如果用户按“取消”按钮进行频繁或快速操作(这是我的解释),则会发生以下错误: ERROR org.hibernate.AssertionFailure - HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to u

我用一个会话连接到数据库。在我的整个课程中,我总是在同一节课上。我的线程“1”捕获数据库中的主要数据。必须允许用户取消此线程。因此,如果用户按“取消”按钮进行频繁或快速操作(这是我的解释),则会发生以下错误:

ERROR org.hibernate.AssertionFailure - HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session) 
org.hibernate.AssertionFailure: possible non-threadsafe access to the session
如果在线程“1”完成后取消后台运行的线程“2”,并尝试从数据库加载另一个主数据集,则会发生相同的错误

我在两个线程中使用同一个会话是否失败


解决此问题的正确方法是什么?

每个线程都应该从Hibernate会话工厂获取自己的会话

实现程序不是线程安全的。相反,每个线程/事务应该从SessionFactory获取自己的实例

请看这里:


当你“取消”一个线程时,它应该自己进行清理,如事务回滚、会话关闭等。

好的……我认为这个解决方案简单而正确。但是所有线程都是连续工作的,所以我认为一个会话就足够了。有没有办法用一个疗程就完成?不太可能。它是这样设计的。文档中写道:“会话的生命周期以逻辑事务的开始和结束为界限”。在Web应用程序中,这通常扩展到多个事务,但在一个线程(请求)内。我也从不在线程完成后关闭会话。如果我需要,总是这样做并打开会话是否更好?正确。请看JavaDoc中的示例。会议将在最后一个街区结束。谢谢。现在我必须重构它…:-)但它是一个正确的工作程序所必需的。。。