我在JBoss EAP 7.0.6上部署了一个Hibernate 5.0.9.Final应用程序(默认为Infinispan 8.0.1.Final)。必须缓存两个实体,它们用JPA的Cacheable和Hibernate的Cache注释,以提供每个实体的缓存策略。
代码库包含一个简单的测试,它检查本地运行的Infinispan与直接访问数据源的testscase一起运行,也就是说,中间没有JBoss EAP,没有Arquillian测试。测试成功运行,我可以看到实体在可用时从缓存中获取。
现在,将应用程序部署到JBoss EAP并运行会带来负面体验。我可以在日志中看到Infinispan缓存实体。我还可以在JBoss Web控制台上看到缓存统计数据。当执行一个应该导致缓存命中计数的查询时,结果是没有发生命中计数,而是查询命中了数据源。
更新:hibernate和infinispan统计都已使用持久性中的适当属性启用。xml;L2C和查询缓存也是如此。区域工厂设置为JndiInfinispanRegionFactory,如中所述http://infinispan.org/docs/8.0.x/user_guide/user_guide.html.此外,所有执行的查询都是JPQL查询。据我所知,tell Infinispan和JBoss As/7使用其默认配置。
更新2:JBoss服务器实际上是EAP 7.0.6,而不是之前所述的AS/7。
我们目前无法升级到JBoss EAP的新版本(恐怕目前还没有Wildfly)。
顺便说一句,尝试在本地运行EhCache是成功的,但是由于模块问题,在JBoss EAP中运行会导致CNFE。
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="DefaultUnit" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:/MyDataSource</jta-data-source>
<class>...</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.connection.datasource" value="java:/MyDataSource"/>
<property name="hibernate.generate_statistics" value="true" />
<property name="hibernate.cache.infinispan.statistics" value="true"/>
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.JndiInfinispanRegionFactory"/>
<property name="hibernate.cache.infinispan.cachemanager" value="java:jboss/infinispan/container/hibernate"/>
</properties>
</persistence-unit>
</persistence>
standalone.xml这个块定义了Hibernate容器
<cache-container name="hibernate" default-cache="local-query" module="org.hibernate.infinispan">
<local-cache name="entity">
<transaction mode="FULL_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>
我强烈建议避免这种组合:
既然你说你不能升级到WildFly(11就要来了!)您落后于近4个主要版本:这是许多缺失的错误修复和改进,但在您正在组合的库的各代中也存在显著差异。
我建议:
我很抱歉在商业上引用EAP,但这可能是一个好的解决方案,这取决于您为什么不能升级到WildFly,因为它本质上是将更高版本(尤其是后端口的兼容性修复)与严格的API向后兼容性策略相结合。
关于Ehcache让你在模块方面遇到麻烦,我很乐意提供帮助。模块系统很棒,我相信这可能很容易解决,但作为一个不同的问题/论坛,这可能会更好。
当执行一个应该导致缓存命中计数的查询时,结果是没有发生命中计数,而是查询命中了数据源。
当你说查询时,你是指JPQL查询还是标准API?
实体查询用于通过实体标识符直接获取。对于查询,您也需要查询缓存,但不清楚这是否是您所需要的。
此外,如果未启用统计信息,则命中计数可以为0:
hibernate.generate_statistics
与Hibernate Core相关hibernate.cache.infinispan.statistics
,对于Infinispan一种解决问题的方法是调试DefaultLoadEventListener#doLoad方法:
entity = loadFromSecondLevelCache( event, persister, keyToLoad );
看看为什么不能从英菲尼斯潘那里拿到。
此外,所有执行的查询都是JPQL查询。
您启用了查询缓存吗?
请注意,查询缓存使用单个区域,因此一旦您添加/删除/修改属于该表空间的任何单个条目,所有使用特定表空间的查询结果都会被清除。
如果您在尝试加速JPQL时依赖实体二级缓存而不使用查询缓存,那么它的工作效率将比没有二级缓存时更低。这是因为JPQL无论如何都会执行SQL查询,所以您只需丢弃结果,然后转到缓存,根据实体的ID获取实体。如果在缓存中找不到实体,这实际上可能会变得非常糟糕,这意味着将发出过多的二次查询。
如果您在执行读写事务时尝试卸载Master节点,第2级缓存很有意义。对于只读查询,只需使用数据库复制并将负载分散到多个副本上,这些副本的缓冲区池配置为将整个工作集存储在RAM中。
persistence.xml配置不正确。部署到EAP时,只需要这些:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="DefaultUnit" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:/MyDataSource</jta-data-source>
<class>...</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.connection.datasource" value="java:/MyDataSource"/>
<property name="hibernate.generate_statistics" value="true" />
<property name="hibernate.cache.infinispan.statistics" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />
</properties>
</persistence-unit>
</persistence>
通过定义您自己的区域工厂,您有可能不使用由EAP管理的实际Infinispan实例,您正在检查统计信息。
查看EAP 7留档了解更多信息。
我的pom。xml如下所示 我已经尝试了三天,使用REdhat入门指南让这个简单的示例代码与Infinispan一起使用,并下载了快速入门zip来运行它,但仍然不起作用!我一直收到Spring JMS的错误“无法连接到foo: 11222”或“池未打开”,然后是关于混合Uber和Jars版本的警告。我开始使用ehcache,这很难实现,因为只有有限的简单示例展示了如何从rest调用等中存储、检索和
Infinispan 是个开源的数据网格平台。它公开了一个简单的数据结构(一个Cache)来存储对象。虽然可以在本地模式下运行Infinspan,但其真正的价值在于分布 式,在这种模式下,Infinispan可以将集群缓存起来并公开大容量的堆内存。这可比简单的复制强大的多,因为它会为每个结点分配固定数量的副本——服 务器故障的一种恢复手段——同时还提升了可伸缩性,这是由于存储每个结点所需的工作量是与集群
我们在Tomcat下有一个web应用程序,它集成了Hibernate4x、Spring4x和HibernateTransactionManager作为我们的事务管理器(目前是一个MySQL资源)。 作为配置分发的一部分,我们应该与Infinispan集成作为缓存管理器,以其他格式存储配置,而不是在MySQL中。意思是,不要像Hibernate那样集成二级缓存! 我设法将Infinispan与Spr
我使用JBoss作为7.1.1最终版本。我已经配置了事务模式为“FULL_XA”的复制缓存。 我使用缓存作为内存数据库。缓存中的条目由应用程序操作(添加/更新/删除)。我面临的场景是,JTA事务回滚不会恢复缓存中先前添加的条目。Infinispan文档指定了要为缓存配置的事务管理器。我相信在JBoss应用服务器上,infinispan应该能够自动选择正确的事务管理器。此外,infinispan 1
我有一个新的打字错误39.5。15安装和添加网格元素9.5。0和t3sbootstrap 4.4。5在PagetConfig中定义的1列后端布局中创建包含3列的内容元素。 在较旧的TYPO3版本中,这工作正常(即TYPO3 7),但在TYPO3 9中,我在FE中得到以下错误: 尝试解析控制器操作的模板文件”标准- 我已经仔细检查并确认,gridelements和t3sbootstrap都包含在网站
请注意,当前版本还处于预览版,请慎重在生产环境中使用 翻译:Ranger Tsao,校对 宋子豪、赵亮 InfinispanClusterManager 是基于 Infinispan 实现。由于 Vert.x 集群管理的可插拔性,也可轻易切换至其它的集群管理器。 InfinispanClusterManager 在组件 vertx-infinispan 中,通过构建工具可以轻松引入: Maven(