2012-07-05 55 views
0

我們在JSP Web應用程序上使用java 1.4,並且我們的Web應用程序不時會完全停止。當用戶嘗試訪問主頁時,他們無法找到頁面。Java堆棧轉儲 - 等待鎖定

發生這種情況時,我們運行一個堆棧轉儲,並使用武士,我可以看到幾個阻塞的線程具有相同的消息

at java.util.Collections$SynchronizedMap.get(Collections.java:1942)      
- waiting to lock <0x23e40898> (a 
java.util.Collections$SynchronizedMap)      at 
org.hibernate.tuple.EntityModeToTuplizerMapping.getTuplizerOrNull(EntityModeToTuplizerMapping.java:53)      at 
org.hibernate.tuple.EntityModeToTuplizerMapping.getTuplizer(EntityModeToTuplizerMapping.java:66)      at 
org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:353)      at 
org.hibernate.type.ComponentType.toLoggableString(ComponentType.java:379)      at 
org.hibernate.pretty.MessageHelper.infoString(MessageHelper.java:89)      at 
org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1355)      at 
org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1308)      at org.hibernate.loader.Loader.getRow(Loader.java:1206) 
     at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:580)      at 
org.hibernate.loader.Loader.doQuery(Loader.java:701)      at 
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)      at 
org.hibernate.loader.Loader.doList(Loader.java:2220)      at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) 
     at org.hibernate.loader.Loader.list(Loader.java:2099)      at 
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)      at 
org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)      at 
org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)      at 
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)      at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)      at 
org.springframework.orm.hibernate3.HibernateTemplate$29.doInHibernate(HibernateTemplate.java:849)      at 
org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)      at 
org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:840)      at 
org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:836) 

如何才能辨別哪些是拿着這個線程了。有什麼工具可以用來識別嗎?

感謝


嗨Mprivat,非常感謝。我將把它帶給我們的架構師,看看我們是否可以完成升級。由於這只是每隔一段時間纔會發生,因此需要一些時間才能確定這是否是原因。我會在幾個月內反饋意見,因爲只有時間可以打電話。非常感謝

回答

3

基礎上進一步研究,以前面加上我以前的答案:

聽起來你正在使用Hibernate的版本比舊的3.2.6(他們解決了這一缺陷)。缺陷ID:HHH-2645

http://lists.jboss.org/pipermail/hibernate-issues/2008-February/009043.html


通常情況下,你應該能夠匹配 「等待鎖定< 0x23e40898>」 的消息與 「設置鎖定< 0x23e40898>」 消息(拼寫可能警惕)。做一個完整的堆棧轉儲(您可以順便使用jstack,它是JDK的標準配置),並搜索您的鎖ID。你會看到一堆等待,但也會看到設置它的線程。

+1

+1我不確定Java 1.4是否有jstack,它的10歲。 – 2012-07-05 14:00:59

+0

好點。 1.5之前沒有jstack – mprivat 2012-07-05 14:08:38