【问题标题】:How to persist Cache Store To a Relational database如何将缓存存储持久化到关系数据库
【发布时间】:2012-09-06 03:37:49
【问题描述】:

有没有办法将 infinispan 缓存存储中的缓存对象持久保存到关系数据库表中?我试图将其作为 Cacheloader 来实现。

 <loader class="org.infinispan.loaders.jdbc.stringbased.JdbcStringBasedCacheStore" fetchPersistentState="true" ignoreModifications="false" purgeOnStartup="false">
    <properties>
     <property name="stringsTableNamePrefix" value="ISPN_STRING_TABLE"/>
     <property name="idColumnName" value="ID_COLUMN"/>
     <property name="dataColumnName" value="DATA_COLUMN"/>
     <property name="timestampColumnName" value="TIMESTAMP_COLUMN"/>
     <property name="timestampColumnType" value="BIGINT"/>
     <property name="connectionFactoryClass" value="org.infinispan.loaders.jdbc.connectionfactory.PooledConnectionFactory"/>
     <property name="connectionUrl" value="jdbc:derby://localhost:1527/DB;create=true"/>
     <property name="userName" value="user"/>
     <property name="password" value="password"/>
     <property name="driverClass" value="org.apache.derby.jdbc.ClientDriver"/>
     <property name="idColumnType" value="VARCHAR(255)"/>
     <property name="dataColumnType" value="BLOB"/>
     <property name="dropTableOnExit" value="false"/>
     <property name="createTableOnStart" value="true"/>

    </properties>
 </loader> 

From 此键和值存储在 ISPN_STRING_TABLE_TEST_STORE 中,其中&lt;namedCache name="TEST_STORE">。它将 ID 列中的键和 DATA_COLUMN 中的值保存为 Blob。我想将此 Blob 包含数据放入关系数据库(不作为对象)。例如,当我将 Employee 对象放入缓存时,它应该将数据库表作为Employee 表,其中包含员工属性作为该表中的字段。(Emp Name、Age.. 等)。有没有办法做到这一点?

【问题讨论】:

    标签: caching jboss infinispan


    【解决方案1】:

    Infinispan Data Grid Platform Book 中有一个示例,它描述了如何使用 MySQL 作为关系数据库来配置 JdbcStringBasedCacheStore。在此示例中,连接 URL 中使用了数据源,但是根据您的需要调整它应该不难。希望它有所帮助。
    问候

    <loaders>
        <loader
            class="org.infinispan.loaders.jdbc.stringbased.JdbcStringBasedCacheStore"
            fetchPersistentState="true" ignoreModifications="false"
            purgeOnStartup="false">
            <properties>
                <property name="stringsTableNamePrefix" value="ISPN_STRING_TABLE" />
                <property name="idColumnName" value="ID_COLUMN" />
                <property name="idColumnType" value="VARCHAR(255)" />
                <property name="dataColumnName" value="DATA_COLUMN" />
                <property name="dataColumnType" value="TRUE" />
                <property name="timestampColumnName" value="TIMESTAMP_COLUMN" />
                <property name="timestampColumnType" value="BIGINT" />
                <property name="connectionFactoryClass"
                    value="org.infinispan.loaders.jdbc.
        connectionfactory.PooledConnectionFactory" />
                <property name="connectionUrl" value="java:jboss/datasources/MySQLDS" />
                <property name="userName" value="xxxx" />
                <property name="password" value="xxxx" />
                <property name="driverClass" value="com.mysql.jdbc.Driver" />
                <property name="dropTableOnExit" value="true" />
                <property name="createTableOnStart" value="true" />
            </properties>
        </loader>
    </loaders>
    

    【讨论】:

    • 其实我想使用 infinispan 作为缓存加载器写入 JPA 或 Hibernate 支持。community.jboss.org/thread/149211 .它支持缓存条目作为 BLOB 写入 DB。如果您可以提供缓存加载器 JPA 编写支持示例,非常感谢。
    【解决方案2】:

    情况似乎发生了变化。这似乎适用于 Infinispan 5.2 和 5.3。

       <loaders [...]>
          <stringKeyedJdbcStore
                xmlns="urn:infinispan:config:jdbc:5.2"
                fetchPersistentState="false"
                ignoreModifications="false"
                purgeOnStartup="false">
             <dataSource jndiUrl="java:jboss/datasources/MySQLDS" />
    <!--
             <connectionPool connectionUrl="jdbc:mysql://[host][:port]/[database]"
                             username="xxxx"
                             password="xxxx"
                             driverClass="com.mysql.jdbc.Driver"/>
    -->
             <stringKeyedTable dropOnExit="true"
                               createOnStart="true"
                               prefix="ISPN_STRING_TABLE">
                <idColumn name="ID_COLUMN" type="VARCHAR(255)" />
                <dataColumn name="DATA_COLUMN" type="BINARY" />
                <timestampColumn name="TIMESTAMP_COLUMN" type="BIGINT" />
             </stringKeyedTable>
          </stringKeyedJdbcStore>
       </loaders>
    

    使用 xmlns urn:infinispan:config:jdbc:5.2 (schemaLocation at link)

    【讨论】:

    • 暗影爬行者,感谢您的回答。我会投票支持它,但我没有足够的声誉。我正在使用带有 postgresql 数据库的 infinispan 5.3,它正在工作“connectionPool”。只需将 infinispan-cachestore-jdbc-5.3.0.Final.jar 和 c3p0-0.9.1.2.jar 添加到我的构建中。
    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2017-07-05
    相关资源
    最近更新 更多