org.infinispan.util.concurrent.TimeoutException: ISPN000299: невозможно получить блокировку через 15 секунд для ключа - PullRequest
0 голосов
/ 11 марта 2020

У меня следующая проблема с кешем Hibernate L2:

  • Thread 1

    • Выполнение собственного запроса: DELETE ... FROM WHERE ... = > весь кэш L2 становится недействительным
    • Продолжительный процесс
  • Поток 2

    • Выполнение собственного запроса: UPDATE SET ... WHERE ... => весь кэш L2 становится недействительным
    • Поток заблокирован потоком 1
    • Через 15 секунд ISPN000299 повышается.

Вот полная трассировка стека:

2020-03-11 15:06:01,384 ERROR [InvocationContextInterceptor] ISPN000136: Error executing command RemoveCommand, writing keys [com.sylob.cochise.dm1.ejb.entite.plageHoraire.PlageHoraireCoreEntite#4028ae256b033913016b0342b7ed6229]: org.infinispan.util.concurrent.TimeoutException: ISPN000299: Unable to acquire lock after 15 seconds for key com.sylob.cochise.dm1.ejb.entite.plageHoraire.PlageHoraireCoreEntite#4028ae256b033913016b0342b7ed6229 and requestor GlobalTransaction:<null>:1485:local. Lock is held by GlobalTransaction:<null>:1402:local
    at org.infinispan.util.concurrent.locks.impl.DefaultLockManager$KeyAwareExtendedLockPromise.lock(DefaultLockManager.java:238)
    at org.infinispan.interceptors.locking.AbstractLockingInterceptor.lockAndRecord(AbstractLockingInterceptor.java:193)
    at org.infinispan.interceptors.locking.AbstractTxLockingInterceptor.checkPendingAndLockKey(AbstractTxLockingInterceptor.java:193)
    at org.infinispan.interceptors.locking.AbstractTxLockingInterceptor.lockOrRegisterBackupLock(AbstractTxLockingInterceptor.java:116)
    at org.infinispan.interceptors.locking.PessimisticLockingInterceptor.visitDataWriteCommand(PessimisticLockingInterceptor.java:134)
    at org.infinispan.interceptors.locking.AbstractLockingInterceptor.visitRemoveCommand(AbstractLockingInterceptor.java:75)
    at org.infinispan.commands.write.RemoveCommand.acceptVisitor(RemoveCommand.java:67)
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:99)
    at org.infinispan.interceptors.TxInterceptor.enlistWriteAndInvokeNext(TxInterceptor.java:367)
    at org.infinispan.interceptors.TxInterceptor.visitRemoveCommand(TxInterceptor.java:231)
    at org.infinispan.commands.write.RemoveCommand.acceptVisitor(RemoveCommand.java:67)
    at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:99)
    at org.infinispan.interceptors.InvocationContextInterceptor.handleAll(InvocationContextInterceptor.java:114)
    at org.infinispan.interceptors.InvocationContextInterceptor.handleDefault(InvocationContextInterceptor.java:83)
    at org.infinispan.commands.AbstractVisitor.visitRemoveCommand(AbstractVisitor.java:48)
    at org.infinispan.commands.write.RemoveCommand.acceptVisitor(RemoveCommand.java:67)
    at org.infinispan.interceptors.InterceptorChain.invoke(InterceptorChain.java:335)
    at org.infinispan.cache.impl.CacheImpl.executeCommandAndCommitIfNeeded(CacheImpl.java:1672)
    at org.infinispan.cache.impl.CacheImpl.removeInternal(CacheImpl.java:557)
    at org.infinispan.cache.impl.CacheImpl.remove(CacheImpl.java:549)
    at org.infinispan.cache.impl.CacheImpl.remove(CacheImpl.java:543)
    at org.infinispan.cache.impl.AbstractDelegatingCache.remove(AbstractDelegatingCache.java:296)
    at org.hibernate.cache.infinispan.util.Caches.removeAll(Caches.java:285)
    at org.hibernate.cache.infinispan.access.InvalidationCacheAccessDelegate.removeAll(InvalidationCacheAccessDelegate.java:149)
    at org.hibernate.cache.infinispan.entity.ReadOnlyAccess.removeAll(ReadOnlyAccess.java:65)
    at org.hibernate.action.internal.BulkOperationCleanupAction$EntityCleanup.<init>(BulkOperationCleanupAction.java:210)
    at org.hibernate.action.internal.BulkOperationCleanupAction$EntityCleanup.<init>(BulkOperationCleanupAction.java:203)
    at org.hibernate.action.internal.BulkOperationCleanupAction.<init>(BulkOperationCleanupAction.java:110)
    at org.hibernate.engine.query.spi.NativeSQLQueryPlan.coordinateSharedCacheCleanup(NativeSQLQueryPlan.java:152)
    at org.hibernate.engine.query.spi.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:176)
    at org.hibernate.internal.SessionImpl.executeNativeUpdate(SessionImpl.java:1373)
    at org.hibernate.internal.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:373)

Я использую Wildfly 10.1.0.Final (автономный полный профиль) с Hibernate 5.0.10.Final / Infinispan 8.2.4.Final.
Environment НЕ кластеризован и сеансы НЕ реплицируются.

Я использую конфигурацию по умолчанию, предоставленную Wildfly для кэша Infinispan L2:

<cache-container name="hibernate" default-cache="local-query" module="org.hibernate.infinispan">
    <local-cache name="entity">
        <transaction mode="NON_XA"/>
        <eviction strategy="LRU" max-entries="10000"/>
        <expiration max-idle="100000"/>
    </local-cache>
    <local-cache name="local-query">
        <eviction strategy="LRU" max-entries="10000"/>
        <expiration max-idle="100000"/>
    </local-cache>
    <local-cache name="timestamps"/>
</cache-container>

В Hibernate 3.x / EhCache, это используется для работа.

Что здесь не так?

Любая поддержка приветствуется ...

1 Ответ

0 голосов
/ 17 марта 2020

Теоретически, все в порядке. Однако из-за некоторых ограничений (пытающихся быть правильными) оба из них пытаются удалить записи по одной в одной транзакции, и это действительно может занять много времени.

WildFly 10 - это более 4 лет старый и так Hibernate 5.0.10. Я не помню, в какой минорной / микро версии что было исправлено, но в достаточно недавнем выпуске Hibernate вы должны go с <transaction mode="NONE"/>, и хотя транзакционная семантика БД будет поддержана, эта проблема должна исчезнуть go.

...