Мы используем Hibernate 4.3.10.Final с включенным ehcache-2.9.0 для кэша второго уровня.
Все объекты настроены для кэширования чтения-записи.
В некоторых сценариях нам необходимо «исключить» сущность из ehcache, чтобы ее можно было принудительно обновить из БД во время следующего чтения. Мы используем следующий код для удаления сущности из ehcache:
Cache cache = sessionFactry.getCache();
if (cache != null) {
cache.evictEntity(PassengerRide.class, id);
}
Иногда мы видим, что в пуле Tomcat не хватает соединений (максимальное активное настроено как 400). Из дампов потоков я мог видеть 359 потоков в состоянии WAITING (парковка), каждый из которых ожидает один и тот же объект <0x00000003a5596f30>. Проверьте ветку "http-nio-443-exec-3240" для справки. Каждый из этих потоков удерживает блокировку на другом объекте. Я не смог найти другой поток, который удерживает блокировку на <0x00000003a5596f30>. Кроме того, существует более 70 потоков в состоянии BLOCKED, ожидающих блокировки объекта, который уже заблокирован вышеупомянутыми потоками в состоянии WAITING. Проверьте ветку "http-nio-443-exec-3591" для справки. Потоки в состоянии BLOCKED либо пытаются получить, либо удалить один и тот же объект из ehcache (не уверен, что все потоки пытаются получить или удалить один и тот же экземпляр).
Это происходит случайным образом, может быть, один раз в неделю или 10 дней. Любые предложения о том, как определить причину и устранить ее?
"http-nio-443-exec-3240" daemon prio=10 tid=0x00007f38c87a4000 nid=0x63bd waiting on condition [0x00007f38fa713000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000003a5596f30> (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireShared(AbstractQueuedSynchronizer.java:964)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireShared(AbstractQueuedSynchronizer.java:1282)
at java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock.lock(ReentrantReadWriteLock.java:730)
at net.sf.ehcache.store.CacheStore$4.call(CacheStore.java:196)
at net.sf.ehcache.store.CacheStore$4.call(CacheStore.java:192)
at net.sf.ehcache.store.cachingtier.OnHeapCachingTier$Fault.get(OnHeapCachingTier.java:334)
- locked <0x000000040847b890> (a net.sf.ehcache.store.cachingtier.OnHeapCachingTier$Fault)
at net.sf.ehcache.store.cachingtier.OnHeapCachingTier$Fault.access$200(OnHeapCachingTier.java:311)
at net.sf.ehcache.store.cachingtier.OnHeapCachingTier.get(OnHeapCachingTier.java:175)
at net.sf.ehcache.store.CacheStore.get(CacheStore.java:192)
at net.sf.ehcache.Cache.get(Cache.java:1734)
at org.hibernate.cache.ehcache.internal.regions.EhcacheTransactionalDataRegion.get(EhcacheTransactionalDataRegion.java:112)
at org.hibernate.cache.ehcache.internal.strategy.AbstractReadWriteEhcacheAccessStrategy.get(AbstractReadWriteEhcacheAccessStrategy.java:79)
at org.hibernate.cache.ehcache.internal.nonstop.NonstopAwareEntityRegionAccessStrategy.get(NonstopAwareEntityRegionAccessStrategy.java:108)
at org.hibernate.engine.internal.CacheHelper.fromSharedCache(CacheHelper.java:55)
at org.hibernate.engine.internal.CacheHelper.fromSharedCache(CacheHelper.java:67)
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromSecondLevelCache(DefaultLoadEventListener.java:598)
at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:452)
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:213)
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:275)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:151)
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1106)
at org.hibernate.internal.SessionImpl.access$2000(SessionImpl.java:176)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2587)
at org.hibernate.internal.SessionImpl.get(SessionImpl.java:996)
at com.xxxxx.ridedao.PassengerDAOImpl.getPassengerRide(PassengerDAOImpl.java:77)
"http-nio-443-exec-3591" daemon prio=10 tid=0x00007f38c8b46800 nid=0x6555 waiting for monitor entry [0x00007f3897af2000]
java.lang.Thread.State: BLOCKED (on object monitor)
at net.sf.ehcache.store.cachingtier.OnHeapCachingTier$Fault.get(OnHeapCachingTier.java:331)
- waiting to lock <0x000000040847b890> (a net.sf.ehcache.store.cachingtier.OnHeapCachingTier$Fault)
at net.sf.ehcache.store.cachingtier.OnHeapCachingTier$Fault.access$200(OnHeapCachingTier.java:311)
at net.sf.ehcache.store.cachingtier.OnHeapCachingTier.getValue(OnHeapCachingTier.java:299)
at net.sf.ehcache.store.cachingtier.OnHeapCachingTier.get(OnHeapCachingTier.java:199)
at net.sf.ehcache.store.CacheStore.get(CacheStore.java:192)
at net.sf.ehcache.Cache.get(Cache.java:1734)
at org.hibernate.cache.ehcache.internal.regions.EhcacheTransactionalDataRegion.get(EhcacheTransactionalDataRegion.java:112)
at org.hibernate.cache.ehcache.internal.strategy.AbstractReadWriteEhcacheAccessStrategy.get(AbstractReadWriteEhcacheAccessStrategy.java:79)
at org.hibernate.cache.ehcache.internal.nonstop.NonstopAwareEntityRegionAccessStrategy.get(NonstopAwareEntityRegionAccessStrategy.java:108)
at org.hibernate.engine.internal.CacheHelper.fromSharedCache(CacheHelper.java:55)
at org.hibernate.engine.internal.CacheHelper.fromSharedCache(CacheHelper.java:67)
at org.hibernate.event.internal.DefaultLoadEventListener.loadFromSecondLevelCache(DefaultLoadEventListener.java:598)
at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:452)
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:213)
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:275)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:151)
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1106)
at org.hibernate.internal.SessionImpl.access$2000(SessionImpl.java:176)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2587)
at org.hibernate.internal.SessionImpl.get(SessionImpl.java:996)
at com.xxxxx.ridedao.PassengerDAOImpl.getPassengerRide(PassengerDAOImpl.java:77)
at sun.reflect.GeneratedMethodAccessor819.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:201)
at com.sun.proxy.$Proxy49.getPassengerRide(Unknown Source)
at com.xxxxx.passenger.PassengerRideService.getPassengerRide(PassengerRideService.java:518)
at com.xxxxx.passenger.PassengerRideService$$FastClassBySpringCGLIB$$7b381e88.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:267)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
at com.xxxxx.passenger.PassengerRideService$$EnhancerBySpringCGLIB$$f29afb12.getPassengerRide(<generated>)
at com.xxxxx.passenger.QRPassengerRideResource.getPassengerRide(QRPassengerRideResource.java:266)
Мы используем OpenJDK 1.8 на виртуальных машинах Ubuntu 16. Я проверил список ошибок OpenJDK и обнаружил JDK-8149018 , что похоже на проблему, с которой мы столкнулись.