【问题标题】:hibernate - stuck in HashMap.getEntry()休眠 - 卡在 HashMap.getEntry()
【发布时间】:2016-02-23 21:25:20
【问题描述】:

我们使用 hibernate 4.3.8.Final、Spring4 和 Java7。

每天有几次我们遇到一些线程在 HashMap.getEntry() 中永远挂起的问题,请参阅 ThreadDump 中的 StackTrace

"catalina77" daemon prio=10 tid=0x00007fa600086800 nid=0x28b7 runnable [0x00007fa5cc6c1000]
   java.lang.Thread.State: RUNNABLE
        at java.util.HashMap.getEntry(HashMap.java:465)
        at java.util.HashMap.get(HashMap.java:417)
        at org.hibernate.engine.internal.StatefulPersistenceContext.getEntity(StatefulPersistenceContext.java:393)
        at         ...

这只会发生,因为底层的 HashMap 被两个不同的线程使用。由于 HashMap 不是线程安全的,该方法会因为 HashMap 第 465 行中的 e = e.next 而永远循环

我很确定我们有两个线程使用相同的休眠会话。

【问题讨论】:

    标签: performance hibernate session


    【解决方案1】:

    我们没有在两个线程中显式使用 Hibernate Session,但是我们有一个自定义缓存,我们确实在其中存储了一些可持久化的域对象,而不是之前将它们转换为数据对象。

    下一个线程正在拾取这些对象。休眠会话与域对象一起存储很长时间,因此您会以某种方式破坏会话。

    因此,如果您遇到此问题,请检查是否将某些域对象保存在内存中的其他位置并在不同的线程中访问它们。

    【讨论】:

      【解决方案2】:

      看来你是对的。 (类似问题:Infinite loop in java.util.HashMap

      休眠会话不是线程安全的。您不应该从多个线程访问它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-09
        • 2011-12-16
        • 2015-07-07
        • 2018-04-06
        • 2014-11-25
        • 1970-01-01
        • 2023-03-18
        • 2016-11-15
        相关资源
        最近更新 更多