缺少 MBean 类型:javax.cache:type=CacheStatistics 在 wildfly 中使用 infinispan 作为 2LC
Missing MBean Type: javax.cache:type=CacheStatistics while using infinispan as 2LC in wildfly
我们使用 wildfly 18.0.1 作为应用服务器。由于不推荐使用 hibernate-ehcache 模块,我们改为使用 hibernate-jcache 模块。 Wildfly 默认使用 infinispan 作为 jcache 实现。
我们还使用 java 旋律来监控我们的应用程序。 Melody 立即找到并显示了 ehcaches 统计信息。但它没有找到 infinispan 统计信息。
infinispan缓存配置在standalone.xml:
...
<cache-container name="hibernate" default-cache="entity" module="org.infinispan.hibernate-cache" statistics-enabled="true">
<local-cache name="timestamps"/>
<local-cache name="entity" statistics-enabled="true">
<object-memory size="10000"/>
<expiration lifespan="300000"/>
</local-cache>
</cache-container>
...
persistence.xml
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="entityManager">
<jta-data-source>java:jboss/datasources/...</jta-data-source>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect"/>
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.generate_statistics" value="true" />
<property name="hibernate.cache.infinispan.statistics" value="true" />
</properties>
</persistence-unit>
</persistence>
因此启用了统计信息。因此,在 CacheManager 的 javadoc 之后,统计对象必须使用唯一且具有以下类型和属性的 ObjectName 进行注册:
类型:javax.cache:type=CacheStatistics
那不会发生。 Java melody 正在寻找这些对象,但找不到任何对象。因此它无法显示有关缓存的任何信息。
显示 infinispan MBean 的 VisualVM 屏幕截图。
只是想知道我是否在监督某些事情,或者这是否应该由 wildfly 或 infinispan 处理?
任何帮助表示赞赏。
谢谢
如您在屏幕截图中所见,infinispan 已将 MBean 注册到对象名称 org.wildfly.clustering.infinispan:type=Cache
下,而不是对象名称 javax.cache:type=CacheStatistics
.
下
所以javamelody找不到javax.cache统计是正常的。
如果我理解正确,wildfly 使用 infinispan 作为默认 2LC 提供程序而不是 jcache 提供程序。它使用模块 'infinispan-hibernate' 而不是 'infinispan-jcache'。这就是为什么它不像 jcache-provider 那样工作。它不是那样使用的。
@evernat 评论将 infinispan 配置为 jcache-provider 引导我找到解决方案。
我们使用 wildfly 18.0.1 作为应用服务器。由于不推荐使用 hibernate-ehcache 模块,我们改为使用 hibernate-jcache 模块。 Wildfly 默认使用 infinispan 作为 jcache 实现。 我们还使用 java 旋律来监控我们的应用程序。 Melody 立即找到并显示了 ehcaches 统计信息。但它没有找到 infinispan 统计信息。 infinispan缓存配置在standalone.xml:
...
<cache-container name="hibernate" default-cache="entity" module="org.infinispan.hibernate-cache" statistics-enabled="true">
<local-cache name="timestamps"/>
<local-cache name="entity" statistics-enabled="true">
<object-memory size="10000"/>
<expiration lifespan="300000"/>
</local-cache>
</cache-container>
...
persistence.xml
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="entityManager">
<jta-data-source>java:jboss/datasources/...</jta-data-source>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect"/>
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.generate_statistics" value="true" />
<property name="hibernate.cache.infinispan.statistics" value="true" />
</properties>
</persistence-unit>
</persistence>
因此启用了统计信息。因此,在 CacheManager 的 javadoc 之后,统计对象必须使用唯一且具有以下类型和属性的 ObjectName 进行注册:
类型:javax.cache:type=CacheStatistics
那不会发生。 Java melody 正在寻找这些对象,但找不到任何对象。因此它无法显示有关缓存的任何信息。
显示 infinispan MBean 的 VisualVM 屏幕截图。
只是想知道我是否在监督某些事情,或者这是否应该由 wildfly 或 infinispan 处理? 任何帮助表示赞赏。 谢谢
如您在屏幕截图中所见,infinispan 已将 MBean 注册到对象名称 org.wildfly.clustering.infinispan:type=Cache
下,而不是对象名称 javax.cache:type=CacheStatistics
.
所以javamelody找不到javax.cache统计是正常的。
如果我理解正确,wildfly 使用 infinispan 作为默认 2LC 提供程序而不是 jcache 提供程序。它使用模块 'infinispan-hibernate' 而不是 'infinispan-jcache'。这就是为什么它不像 jcache-provider 那样工作。它不是那样使用的。 @evernat 评论将 infinispan 配置为 jcache-provider 引导我找到解决方案。