我通过一个会话连接到数据库。在整个程序中,我总是有相同的会话。我的线程“ 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获取其自己的实例。
参见此处:Hibernate Session JavaDoc
当您“取消”线程时-它应该自己进行清理,例如事务回滚,会话关闭等。