我通过一个会话连接到我的数据库。我在整个计划中总是使用相同的会话。我的线程“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”时发生相同的错误。
我在两个线程中使用相同会话的失败是什么?
解决此类问题的正确方法是什么?
答案 0 :(得分:5)
每个线程都应该从Hibernate会话工厂获取自己的会话。
实现者不应该是线程安全的。相反,每个线程/事务应该从SessionFactory获取自己的实例。
当你“取消”一个线程时 - 它应该像事务回滚,会话关闭等那样进行自己的清理。