2011-11-07 13 views
6

ehCache 2.4.4'ü kullanarak, ehCache Segment nesnesinde bir kilitlenme içine girmiş gibi görünüyor. Diğer kayıtlardan, 'beklemekte olan iplik' 1694'ün, bu yığın izinin üretilmesinden en az 9 saat önce çalıştığını biliyorum. Bu arada, 1696 başka birçok iş yaptı ve yaptı, bu yüzden bu kilit kesinlikle hatalı bir şekilde tutuluyor.Bu belirgin EhCache kilitlenmesinin etrafında nasıl çalışabilirim?

Doğrudan herhangi bir Segment örneğini doğrudan kilitlemediğimden oldukça eminim, bu nedenle kitaplığın içinde bir tür sorun olduğunu varsayalım. Herhangi bir fikir?

"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 lock=java.util.c[email protected] 
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

Bu sorunun geçersiz olduğunu ortaya çıkarır. Bu belgeleri (http://ehcache.org/documentation/user-guide/jta#performance) açık kilitlerin Kesim tabanlı kilitleme kullanmadığını belirterek yorumlamıştım, ancak bu doğru değil. Bu kilitlenme kodumdan kaynaklanıyordu, sonunda bir() blokta olmayan bir kilit açma vardı. – sharakan

+3

Neden zaten çözdüyseniz kendi sorunuzu cevaplamıyorsunuz, bu yüzden cevaplanmamış sorularda olmayacak mı? – xmoex

cevap

1

Cache.acquireWriteLockOnKey gibi çağrılar iç Segmentinin bir kilit elde sonunda çıkıyor, bu nedenle bu bariz kilitlenme nihayet engellemek bir değildi bir .unlock çağrısı neden oldu.

Editoryal Yorum: Ayrıca, aynı Segmentte olan iki farklı anahtarı kilitlemeye çalışırken çekişme sağlayabileceğinizi ima eder, ki bu oldukça talihsiz bir durumdur.

+1

Gerçekten durum buysa, bu gönderiyi cevap olarak işaretleyebilirsiniz. Cevabın solundaki oy sayacının altında bulunan büyük onay işaretine tıklayın - bu şekilde soruyu yanıtladığınızı belirtirsiniz :) –

İlgili konular