2011-11-07 14 views
6

ehCache 2.4.4 का उपयोग करके, मुझे लगता है कि ehCache सेगमेंट ऑब्जेक्ट पर डेडलॉक हो गया है। अन्य लॉगिंग से, मुझे पता है कि 'प्रतीक्षा थ्रेड', 16 9 4 आखिरकार इस स्टैक ट्रेस उत्पन्न होने से 9 घंटे पहले कुछ भी चला गया। इस बीच, 16 9 6 कई अन्य काम चला गया है और किया गया है, इसलिए यह ताला निश्चित रूप से गलत तरीके से आयोजित किया जा रहा है।मैं इस स्पष्ट एह कैश डेडलॉक के आसपास कैसे काम कर सकता हूं?

मुझे पूरा भरोसा है कि मैं सीधे किसी सेगमेंट इंस्टेंस को लॉक नहीं कर रहा हूं, इसलिए मुझे लगता है कि यह लाइब्रेरी में किसी प्रकार का मुद्दा आंतरिक है। कोई विचार?

"Model Executor - 1696" Id=1696 in TIMED_WAITING on lock=java.u[email protected]92eb1ed 
at sun.misc.Unsafe.park(Native Method) 
at java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source) 
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(Unknown Source) 
at java.util.concurrent.PriorityBlockingQueue.poll(Unknown Source) 
at com.rtrms.application.modeling.local.BlockingTaskList.takeTask(BlockingTaskList.java:20) 
at com.rtrms.application.modeling.local.ModelExecutor.executeNextTask(ModelExecutor.java:71) 
at com.rtrms.application.modeling.local.ModelExecutor.run(ModelExecutor.java:46) 

Locked synchronizers: count = 1 
    - [email protected]3d767f 

"Model Executor - 1694" Id=1694 in WAITING on loc[email protected]4a3d767f 
owned by Model Executor - 1696 Id=1696 
at sun.misc.Unsafe.park(Native Method) 
at java.util.concurrent.locks.LockSupport.park(Unknown Source) 
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown Source) 
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(Unknown Source) 
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(Unknown Source) 
at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(Unknown Source) 
at net.sf.ehcache.store.compound.Segment.unretrievedGet(Segment.java:248) 
at net.sf.ehcache.store.compound.CompoundStore.unretrievedGet(CompoundStore.java:191) 
at net.sf.ehcache.store.compound.impl.DiskPersistentStore.containsKeyInMemory(DiskPersistentStore.java:72) 
at net.sf.ehcache.Cache.searchInStoreWithStats(Cache.java:1884) 
at net.sf.ehcache.Cache.get(Cache.java:1549) 
at com.rtrms.amoeba.cache.DistributedModeledSecurities.get(DistributedModeledSecurities.java:57) 
at com.rtrms.amoeba.modeling.AssertPersistedModeledSecurities.get(AssertPersistedModeledSecurities.java:44) 
at com.rtrms.application.modeling.tasks.ExpandableModelingTask.getNextUnexecutedTask(ExpandableModelingTask.java:35) 
at com.rtrms.application.modeling.local.BlockingTaskList.takeTask(BlockingTaskList.java:36) 
at com.rtrms.application.modeling.local.ModelExecutor.executeNextTask(ModelExecutor.java:71) 
at com.rtrms.application.modeling.local.ModelExecutor.run(ModelExecutor.java:46) 

Locked synchronizers: count = 0 
+0

यह पता चला है कि यह प्रश्न अमान्य है। मैंने इस दस्तावेज (http://ehcache.org/documentation/user-guide/jta#performance) का अर्थ यह बताया है कि स्पष्ट ताले सेगमेंट आधारित लॉकिंग का उपयोग नहीं करते हैं, लेकिन यह पता चला है कि यह सच नहीं है। यह डेडलॉक मेरे कोड के कारण हुआ था, एक लॉक रिलीज था जो अंततः() ब्लॉक में नहीं थी। – sharakan

+3

यदि आप पहले से ही इसे समझ चुके हैं तो आप अपने प्रश्न का उत्तर क्यों नहीं देते हैं, तो यह अनुत्तरित प्रश्नों में मौजूद नहीं होगा? – xmoex

उत्तर

1

बाहर कर देता है कि Cache.acquireWriteLockOnKey की तरह कॉल खत्म आंतरिक सेगमेंट पर एक ताला प्राप्त करने के, तो यह स्पष्ट गतिरोध एक .unlock कॉल कि अंत में ब्लॉक एक में नहीं था की वजह से किया गया था।

संपादकीय टिप्पणी: यह भी दर्शाता है कि आप एक ही सेगमेंट में होने वाली दो अलग-अलग कुंजियों को लॉक करने की कोशिश कर विवाद प्राप्त कर सकते हैं, जो कि बहुत दुर्भाग्यपूर्ण है।

+1

यदि यह वास्तव में मामला है, तो आप इस पोस्ट को उत्तर के रूप में चिह्नित कर सकते हैं। उत्तर के बाईं ओर वोट काउंटर के नीचे बस बड़े चेक मार्क प्रतीक पर क्लिक करें - इस तरह आप संकेत देते हैं कि प्रश्न का उत्तर दिया गया है :) –

संबंधित मुद्दे