Возможен ли тупик в Hibernate с EhCache? - PullRequest
0 голосов
/ 23 января 2019

Мы используем 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 , что похоже на проблему, с которой мы столкнулись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...