未使用 Wildfly 15+ 使用 invalidation-cache 和 jdbc-store 自动创建 Infinispan 缓存表

Posted

技术标签:

【中文标题】未使用 Wildfly 15+ 使用 invalidation-cache 和 jdbc-store 自动创建 Infinispan 缓存表【英文标题】:Infinispan cache table not auto-created with Wildfly 15+ using invalidation-cache and jdbc-store 【发布时间】:2019-09-16 18:27:01 【问题描述】:

我正在尝试将 jdbc-store 类型用于 Wildfly 15+ 中的会话缓存。

我运行了以下命令来配置我的standalone-full-ha.xml 配置文件:

/subsystem=infinispan/cache-container=web/invalidation-cache=jdbc/:add(mode=SYNC)
/subsystem=infinispan/cache-container=web/invalidation-cache=jdbc/store=none:remove()allow-resource-service-restart=true
/subsystem=infinispan/cache-container=web/invalidation-cache=jdbc/store=jdbc/:add(data-source="...",passivation=false,shared=true)allow-resource-service-restart=true
/subsystem=infinispan/cache-container=web/invalidation-cache=jdbc/component=transaction/:add()
/subsystem=infinispan/cache-container=web/invalidation-cache=jdbc/component=transaction/:write-attribute(name=mode,value=BATCH)
/subsystem=infinispan/cache-container=web:write-attribute(name=default-cache,value=jdbc)

... 在配置文件中生成以下内容:

<cache-container name="web" default-cache="jdbc" module="org.wildfly.clustering.web.infinispan">
    <transport lock-timeout="60000"/>
    <invalidation-cache name="jdbc">
        <transaction mode="BATCH"/>
        <jdbc-store data-source="..." passivation="false" shared="true">
            <table/>
        </jdbc-store>
    </invalidation-cache>
    <distributed-cache name="dist">
        <locking isolation="REPEATABLE_READ"/>
        <transaction mode="BATCH"/>
        <file-store/>
    </distributed-cache>
</cache-container>

看起来我已经使用 JBoss CLI 正确配置了缓存,但是当集群实例启动时,即使一切正常启动,会话存储表也没有在数据库中创建。

我的问题是,我应该在 &lt;table/&gt; 元素中设置一些我刚刚忽略的东西吗?查看documentation,我没有看到任何必需的属性,或任何关于自动创建的信息。

我已经查看了以前的 examples 如何在 Wildfly 11 中实现这一点,但 string-keyed-jdbc-store 元素似乎不再有效。我知道 Infinispan documentation 提到了 string-keyed-table 元素上的 create-on-start 属性,但这种配置在 Wildfly 中非常不同,完全没有帮助。

【问题讨论】:

这里的问题可能是 ISPN-5267 没有移植到 WildFly。此处的解决方法是将 Infinispan 与您的应用程序一起部署,而不是使用 WildFly 提供的 Infinispan。通过这样做,您将能够使用上面链接的配置。 WildFly 定义的Infinispan 实例主要是为WildFly 的内部用例设计的。因此,为什么有些东西可能会在那里丢失,因为 WildFly 本身不使用它们。应通过部署您自己的 Infinispan 实例并在您自己的应用程序中管理生命周期来解决任何差距。他们当然仍然可以与 WildFly 中的数据源对话。 @GalderZamarreño 您的意思是将其部署为独立服务器,还是有办法将 Infinispan 的非嵌入式副本部署到 Wildfly? 不需要独立服务器。只需将 Infinispan 核心和公共资源以及任何其他嵌入式依赖项与您的应用程序捆绑在一起,进行设置并执行您需要做的事情。 【参考方案1】:

添加

<property name="createTableOnStart">
    true
</property>

在您的 jdbc-store 元素中 并确保您的 web.xml 是 &lt;distributable /&gt;

【讨论】:

以上是关于未使用 Wildfly 15+ 使用 invalidation-cache 和 jdbc-store 自动创建 Infinispan 缓存表的主要内容,如果未能解决你的问题,请参考以下文章

EJB 未使用 @EJB 在 Wildfly 9.0.0 中初始化

从 Wildfly 11 升级到 Wildfly 15 时的日期序列化问题

如何使用 JPA/EJB3 和 WildFly 读取未提交的数据?

使用捆绑在 webapp 中并在 Wildfly 上运行的 myfaces 时未调用 CDI Bean 方法

选择多个配置文件时,wildfly-maven-plugin 未部署

Wildfly 10.1.0 - 未找到 Mysql 数据源