当前位置: 首页 > 知识库问答 >
问题:

Hibernate L2C与Infinispan和JBoss EAP 7.0.6不工作

周和安
2023-03-14

我在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>

共有3个答案

东郭兴学
2023-03-14

我强烈建议避免这种组合:

  • JBoss AS7很古老,不能与Java 8完全兼容

既然你说你不能升级到WildFly(11就要来了!)您落后于近4个主要版本:这是许多缺失的错误修复和改进,但在您正在组合的库的各代中也存在显著差异。

我建议:

  • 坚持使用Ehcache
  • 坚持使用应用服务器中包含的旧版本的Hibernate ORM
  • 更新至WildFly 11:-)
  • 获取受支持的JBoss EAP 7.x

我很抱歉在商业上引用EAP,但这可能是一个好的解决方案,这取决于您为什么不能升级到WildFly,因为它本质上是将更高版本(尤其是后端口的兼容性修复)与严格的API向后兼容性策略相结合。

关于Ehcache让你在模块方面遇到麻烦,我很乐意提供帮助。模块系统很棒,我相信这可能很容易解决,但作为一个不同的问题/论坛,这可能会更好。

刘绍晖
2023-03-14

当执行一个应该导致缓存命中计数的查询时,结果是没有发生命中计数,而是查询命中了数据源。

当你说查询时,你是指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中。

姬寂离
2023-03-14

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(