2012-09-13 56 views
2

有什么办法可以将缓存对象持久化到缓存存储到关系数据库表?我试图将其作为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> 

从该键和值是存储在ISPN_STRING_TABLE_TEST_STORE其中< namedCache名称= “TEST_STORE”>。它将ID列中的键和DATA_COLUMN中的值保存为Blob.I要将此Blob Contain数据放入关系数据库(而不是Object)。例如,当我将一个Employee对象放入Cache中时,它应该将数据库表作为雇员表emplyee属性作为该表中的字段(雇员名称,年龄..等)。是否有办法做到这一点?

回答

3

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> 
+0

其实我想用Infinispan的高速缓存写入装载机JPA或休眠support.https://community.jboss.org/thread/149211。其支持高速缓存条目作为BLOB写入数据库。如果您可以提供缓存加载器JPA写支持的例子非常感谢。 – Kalla

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)

+0

暗影爬行者,谢谢你的回答。我会为它投票,但我没有足够的声誉。我正在使用infinispan 5.3与postgresql数据库,它的工作“connectionPool”。只需要将infinispan-cachestore-jdbc-5.3.0.Final.jar和c3p0-0.9.1.2.jar添加到我的版本中。 – MDHomem