【问题标题】:Hibernate AssertionFailure in different Threads不同线程中的休眠 AssertionFailure
【发布时间】:2012-09-24 05:11:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: java multithreading hibernate assertions


    【解决方案1】:

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

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

    请看这里:Hibernate Session JavaDoc

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

    【讨论】:

    • 好的...这个解决方案是我认为的简单而正确的方法。但是所有线程都在连续工作,所以我认为一个会话就足够了。有没有办法只用一个会话来做到这一点?
    • 并非如此。它是这样设计的。来自文档:“会话的生命周期受逻辑事务的开始和结束的限制”。在 Web 应用程序中,这通常扩展到多个事务,但仍存在于一个线程(请求)中。
    • 我也永远不会在线程完成后关闭会话。如果我需要,总是这样做并打开会话会更好吗?
    • 正确。查看 JavaDoc 中的示例。会话正在 finally 块中关闭。
    • 谢谢。现在我必须重构它...:-) 但它是正确工作程序所必需的...
    猜你喜欢
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 2019-08-12
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多