4

我通过一个会话连接到我的数据库。在我的整个程序中,我总是有相同的会话。我的线程“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”并尝试从数据库加载另一个主数据集,则会发生相同的错误。

我在我的两个线程中使用相同的会话失败了吗?

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

4

1 回答 1

5

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

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

请参见此处:休眠会话 JavaDoc

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

于 2012-10-03T09:43:19.253 回答