JBoss EAP 6.1的Infinispan超时异常

如何解决JBoss EAP 6.1的Infinispan超时异常

这使我发疯。我正进入(状态 像这样的例外情况是随机出现的:

ISPN000136: Execution error: org.infinispan.util.concurrent.TimeoutException: Unable to acquire lock after [60 seconds] on key [com.acme.entity.EntityA#9073] for requestor [GlobalTransaction:<null>:9593:local]! Lock held by [GlobalTransaction:<null>:9580:local]

设置相当老:第二级缓存使用带有Infinispan 5.2.6的JBoss EAP 6.1。 可以有多个JBoss服务器作为独立实例运行(未配置为集群),但是它们使用sqlProxy和percona MysqL集群。 (但是,在同一JBoss实例中,在同一台服务器上有一个DB时,我们遇到了相同的问题。)

standalone.xml中的配置当前为:

  <subsystem xmlns="urn:jboss:domain:infinispan:1.5">
            <cache-container name="web" aliases="standard-session-cache" default-cache="local-web" module="org.jboss.as.clustering.web.infinispan">
                <local-cache name="local-web" batching="true">
                    <file-store passivation="false" purge="false"/>
                </local-cache>
            </cache-container>
            <cache-container name="hibernate" default-cache="local-query" module="org.jboss.as.jpa.hibernate:4">
                <local-cache name="entity">
                    <locking isolation="READ_COMMITTED" acquire-timeout="60000"/>
                    <transaction mode="NON_XA"/>
                    <eviction strategy="LRU" max-entries="10000"/>
                    <expiration max-idle="100000"/>
                </local-cache>
                <local-cache name="local-query">
                    <locking isolation="READ_COMMITTED" acquire-timeout="60000"/>
                    <transaction mode="NONE"/>
                    <eviction strategy="LRU" max-entries="10000"/>
                    <expiration max-idle="100000"/>
                </local-cache>
                <local-cache name="timestamps">
                    <transaction mode="NONE"/>
                    <eviction strategy="NONE"/>
                </local-cache>
            </cache-container>
        </subsystem>

我们尝试了不同的超时值,但没有成功。最近,我们将隔离从认的REPEATABLE_READ(在JBoss 6.1中)更改为READ_COMMITTED(这似乎是Infinispan 5.2.6的认设置,并在WildFly 9中更改为认设置),另请参见https://developer.jboss.org/thread/243458。 我希望可以解决此问题,但是我们仍然看到这些超时异常。

对于使用第二级缓存的实体,我们在实体上使用它:

@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL,region="cache.StandardEntity")
public class EntityA

在我们的infinispan.xml文件中,我们具有:

 <namedCache name="Acme.cache.StandardEntity">
      <eviction strategy="LRU" maxEntries="1000"/>
      <expiration maxIdle="3600" lifespan="3600" wakeUpInterval="7200000"/>
   </namedCache>

几年前,当我们从EH缓存迁移时,infispan.xml文件是由工具创建的。 akeUpInterval看起来很高。这可能是个问题吗? 我实际上不确定namedCache是​​否配置正确。它是否需要以Acme在这种情况下为应用程序的名称)作为前缀。我如何测试这些命名的缓存是否已实际使用。对于standalone.xml文件中需要配置的内容以及infinispan.xml文件中需要配置的内容我有些困惑。

配置中是否仍可以尝试解决此问题?

如果没有,我怎么知道谁“锁了门”(获得了锁)。我可以看到线程试图打开门(试图获取锁)并抱怨(引发了异常),但是我看不到谁首先将其锁定。如果我能看到谁握了这么长时间的锁,我也许可以修复它。

在本地我可以为此启用日志记录

 <logger category="org.infinispan.util.concurrent.locks">
                <level name="TRACE"/>
 </logger>

但是我不能在生产中真正做到这一点(太多的日志记录)。但是在本地我无法复制它。还有其他想法如何找出哪个线程获得了锁吗?

任何想法都值得赞赏。

谢谢!

解决方法

似乎您在锁上有并发访问问题。我建议使用悲观锁定来避免此问题,它会增加资源,但在那些情况下会有所帮助:

/subsystem=infinispan/cache-container=web/local-cache=persistent/transaction=TRANSACTION/:add(locking=PESSMISTIC)

关于infinispan.xml:此文件仅适用于Red Hat Data GRid(JDG,RHDG)嵌入式模式(或社区Infinispan版本)。对于EAP 6.1,您需要使用standalone-hastandalone-full-ha配置文件来设置缓存属性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?