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

当Hibernate查询缓存处于活动状态时,Wildfly无法启动

许天逸
2023-03-14

我们正在将应用程序从JBoss EAP 6.4迁移到WildFly 14。我们遇到了Hibernate和Infinispan的问题。

该应用程序被配置为使用Hibernate的二级缓存(也称为2LC)和Wildfly提供的Infinispan。

在启用2LC缓存但禁用查询缓存的情况下,应用程序启动并似乎正常工作。

但是当我们尝试再次启用查询缓存(属性hibernate.cache.use_query_cache设置为true)时,它会在初始化期间崩溃,从而给出连接的stacktrac。

java.lang.ClassCastException: org.infinispan.hibernate.cache.v53.impl.DomainDataRegionImpl cannot be cast to org.hibernate.cache.spi.QueryResultsRegion

在调试时,我无法理解为什么管理二级缓存的Hibernate的内部代码试图将实体缓存区域强制转换为查询结果缓存区域。

我试图为每个缓存使用分离的缓存,通过定义属性hibernate.cache.infinispan.query.cfgInfinispan配置中定义的缓存本地查询,但似乎Hibernate没有考虑到这一点。

我是相当初学者在缓存,我必须承认,我不完全明白我在做什么,即使在阅读了很多留档。

版本:

  • Hibernate5.3.6。最终

这是我们关注的pom中的Maven依赖项声明。xml(应用程序分为几个Maven项目)

  • org.infinispan: infinispan-spring4-嵌入(默认/编译)
  • org.infinispan:infinispan-core(提供)
  • org.infinispan:infinispan-Commons(提供)
  • org.infinispan: infinispan-hibernate-cache-v53(提供)
  • org.infinispan: infinispan-hibernate-cache-spi(提供)
  • org.infinispan:infinispan-hibernate-cache-Commons(提供)

所有这些都在9.3.1版本中。最终

这是存储在standalone.xml中的缓存容器配置:

        <subsystem xmlns="urn:jboss:domain:infinispan:7.0">
            ...
            <cache-container name="hibernate" module="org.infinispan.hibernate-cache">
                <local-cache name="entity">
                    <transaction mode="NON_XA"/>
                    <object-memory size="10000"/>
                    <expiration max-idle="100000"/>
                </local-cache>
                <local-cache name="local-query">
                    <object-memory size="10000"/>
                    <expiration max-idle="100000"/>
                </local-cache>
                <local-cache name="timestamps"/>
            </cache-container>
        </subsystem>

jboss-deployment-structure.xml的依赖项部分。

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        ...
        <dependencies>
            <!-- Infinispan -->
            <module name="org.infinispan" /> 
            <module name="org.infinispan.commons" />
            <module name="org.infinispan.hibernate-cache"/>

        </dependencies>
    </deployment>
</jboss-deployment-structure>

我们的Infinispan配置文件:

<infinispan
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:infinispan:config:7.0 http://www.infinispan.org/schemas/infinispan-config-7.0.xsd"
    xmlns="urn:infinispan:config:7.0">
    <threads />

    <cache-container name="DefaultCacheManager"
        statistics="true">
        <transport />
        <jmx duplicate-domains="true" />

        <local-cache name="___defaultcache">
            <transaction mode="NONE" />
        </local-cache>

        <local-cache name="defaultCache">
            <transaction mode="NONE" />
            <expiration lifespan="1000" max-idle="1000" interval="500" />
            <memory>
                <object size="1000" />
            </memory>
            <persistence passivation="false">
                <file-store purge="false" read-only="false"
                    path="${jboss.server.temp.dir}/cacheservice" />
            </persistence>
        </local-cache>

        <local-cache name="local-query">
            <locking isolation="READ_COMMITTED" concurrency-level="1000"
                acquire-timeout="15000" striping="false" />
            <eviction max-entries="140000" strategy="LRU" />
            <expiration max-idle="1200000" />
            <transaction mode="NONE" auto-commit="false" />
        </local-cache>

        <!-- Other application caches ... -->

    </cache-container>
</infinispan>

WildFly standalone实例没有正确启动,而是在其初始化过程中崩溃,在尝试装入2LC缓存时,并给出以下堆栈跟踪。

正在设置hibernate.cache。使用query\u cache修复错误问题,但我们确实需要query cache。

Caused by: java.lang.ClassCastException: org.infinispan.hibernate.cache.v53.impl.DomainDataRegionImpl cannot be cast to org.hibernate.cache.spi.QueryResultsRegion
    at org.hibernate.cache.internal.EnabledCaching.makeQueryResultsRegionAccess(EnabledCaching.java:491)
    at org.hibernate.cache.internal.EnabledCaching.getQueryResultsCache(EnabledCaching.java:478)
    at org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2515)
    at org.hibernate.loader.Loader.list(Loader.java:2498)
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:109)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1959)
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:370)
    at fr.bdf.interop.middle.dao.hibernate.HibernateGenericDao.find(HibernateGenericDao.java:110)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
    at com.sun.proxy.$Proxy204.find(Unknown Source)
    ...

谢谢

共有2个答案

贡光明
2023-03-14

我在迁移到WildFly 17.0.0后遇到了同样的问题。最终。应用程序服务器在其模块文件夹中已经包含Hibernate 5.3.10。在调查问题后,我发现实际上Hibernate版本有https://hibernate.atlassian.net/browse/HHH-13586错误。由于我没有任何计划将我们的项目从WildFly 17迁移到更新的版本,我决定修补Hibernate库的当前版本。所以我只是下载了5.3.10版本并通过https://github.com/hibernate/hibernate-orm/commit/2076c68ddff5dc39055e90e162a34c99c72261cb提交修补了hibernate-core模块,构建它并更改了WildFly模块文件夹中的原始hibernate-core lib。java.lang.ClassCastException消失了。也许它会帮助别人。

尉迟墨竹
2023-03-14

最后我找到了如何修复它。正如Radim Vansa所说,问题来自实体/集合缓存区域和查询缓存区域之间的冲突。

在与缓存相关的Hibernate文档中,我发现要定义查询或条件的缓存区域名称,必须使用setCacheRegion(String)方法。

通过在我们的代码中搜索所有这些方法调用,我终于意识到在我们的抽象泛型DAO类中,我们定义查询区域名称如下:

public HibernateGenericDao(Class<E> type) {
    ...
    this.cacheRegion = type.getCanonicalName();
}

然后在此处使用cacheRegion字段:

criteria.setCacheRegion(getCacheRegion());

假设实体/集合缓存区域名称也由实体类完全限定名称定义(我们不知道如何定义),在查询缓存区域名称后添加后缀可以解决冲突并使应用程序正确启动。

this.cacheRegion = type.getCanonicalName().concat(QUERY_CACHE_REGION_PREFIX);

谢谢

 类似资料:
  • 问题内容: 我的服务器运行CentOS 6.4,并使用yum和CentOS的存储库安装MySQL 5.1.69,以及使用yum和ius的存储库安装的PHP 5.4.16。 Edit3 升级到MySQL服务器版本:5.5.31由IUS社区项目分发,并且错误仍然存​​在。然后将库更改为mysqlnd,似乎消除了该错误。仍然要反复进行此操作,以了解为什么有时仅出现此错误。 使用PDO并使用创建PDO对象

  • 我的服务器运行CentOS 6.4和MySQL 5.1。69使用yum、CentOS的repos和PHP 5.4安装。16使用yum和ius的repos安装。Edit3升级到MySQL服务器版本:5.5。31由IUS社区项目分发,错误仍然存在。然后将库更改为mysqlnd,似乎消除了错误。尽管如此,我们仍然需要知道为什么这个错误只是偶尔出现。 当使用PDO并使用

  • 问题内容: 从MDN for NodeList: 在某些情况下,NodeList是一个实时集合,这意味着DOM中的更改会反映在集合中。例如,Node.childNodes处于活动状态: 在其他情况下,NodeList是静态集合,这意味着DOM中的任何后续更改都不会影响集合的内容。document.querySelectorAll返回一个静态NodeList。 所以....有点烦!是否有任何关于哪些

  • 问题涉及的方法是: 编辑。以下是完整的堆栈跟踪(一些消息是西班牙语的):

  • 我正在寻找一种方法,显示一个div时,一个锚点被点击。我在我的页面上有一个HTML5/PHP表单,当提交时,它会将用户带着一条谢谢消息带到div中放置的锚,这是激活该链接的唯一方法。这是我试图显示的div: 当锚点处于活动状态时,是否有一种方法可以改变(可能使用CSS)显示:none?

  • 本文向大家介绍在 WildFly 中启用 Hibernate 缓存,包括了在 WildFly 中启用 Hibernate 缓存的使用技巧和注意事项,需要的朋友参考一下 示例 要在WildFly中为Hibernate启用二级缓存,请将此属性添加到persistence.xml文件中: 您还可以使用以下属性启用查询缓存: 启用Hibernate的二级缓存时,WildFly不需要您定义缓存提供程序,因为