2013年4月26日金曜日

JBossDataGridでPostgreSQLに接続する

JBossテクニカルチームの寺田です。

今回は、JBossDataGirdで永続ストアとしてPostgreSQLを用意し、JDBC接続を行います。

Aagenda

永続化ストアと連携をする上で必要となるコンポーネント

永続データストアとは、永続化する際に保存するファイル、リレーショナルデータベースですが、その永続データストアと連携をする上で出てくるコンポーネントが、キャッシュローダ、キャッシュストアとなります。

キャッシュローダ

キャッシュローダとは、キャッシュにデータが無い場合に、永続データストアからデータを読み込みます。

キャッシュストア

キャッシュストアは、キャッシュローダを拡張したもので、永続データストアからデータを読み込む機能に加えて、永続データストアにデータを格納する機能を持ちます。

キャッシュストアの種類

キャッシュストアの種類としては以下のものがあるようです。

  • FileCacheStore: ファイルキャッシュストア
  • RemoteCacheStore: リモートストア
  • Jdbc-basedCacheStore: JDBCベースのキャッシュストア。永続化するキーによりJdbcBinaryCacheStore、JdbcStringBasedCacheStore、JdbcMixedCacheStoreの3つが存在します

JDBCでの接続

JDBCでPostgreSQLに接続してみます。まず、題材としては、infinispan-quickstart\embedded-cacheを使い、embedded-cache-jdbcという名前でJDBC接続するようにしてみます。利用するキャッシュストアは、簡単そうなのでJdbcStringBasedCacheStoreとします。簡単に1~100のキーを指定して、読み込んだデータの値に、"value"という文字列を追加するというサンプルを作ってみました。以下は作成したJdbcStoreTest.javaの中身です。

package org.infinispan.quickstart.embeddedcache;
import org.infinispan.Cache;
import org.infinispan.manager.DefaultCacheManager;
import java.lang.Integer;
public class JdbcStoreTest {
  public static void main(String args[]) throws Exception {
    Cache cache = new DefaultCacheManager("JdbcStoreTest.xml").getCache("xml-configured-cache");
    for(int i=1 ; i <= 100; i++){
      System.out.println("Key = " + java.lang.Integer.toString(i) + ",Value = " +  cache.get(java.lang.Integer.toString(i)));
    }
    // Add a entry
    for(int i=1 ; i <= 100; i++){
      cache.put(java.lang.Integer.toString(i), "value"+ java.lang.Integer.toString(i));
    }
  }
}
xmlで定義したキャッシュマネージャ定義ファイル(JdbcStoreTest.xml"は以下のようになっています。赤字の部分でテーブル名、カラム名、カラムの型等設定ができます。
<infinispan
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="urn:infinispan:config:5.1 http://www.infinispan.org/schemas/infinispan-config-5.1.xsd"
  xmlns="urn:infinispan:config:5.1">
  <namedCache name="xml-configured-cache">
    <locking isolationLevel="REPEATABLE_READ"  lockAcquisitionTimeout="20000" writeSkewCheck="false"  concurrencyLevel="500" useLockStriping="false" />
    <jmxStatistics enabled="true" />
    <loaders passivation="false">
      <loader  class="org.infinispan.loaders.jdbc.stringbased.JdbcStringBasedCacheStore" fetchPersistentState="false" ignoreModifications="false"  purgeOnStartup="false">
        <properties>
          <property name="connectionFactoryClass" value="org.infinispan.loaders.jdbc.connectionfactory.SimpleConnectionFactory" />
          <property name="connectionUrl" value="jdbc:postgresql://localhost:5432/postgres" />
          <property name="userName" value="postgres" />
          <property name="password" value="password" />
          <property name="driverClass" value="org.postgresql.Driver" />
          <property name="stringsTableNamePrefix" value="SAMPLE_" />
          <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="driverClass" value="org.postgresql.Driver" />
          <property name="idColumnType" value="VARCHAR(255)" />
          <property name="dataColumnType" value="bytea" />
          <property name="dropTableOnExit" value="false" />
          <property name="createTableOnStart" value="true" />
        </properties>
      </loader>
    </loaders>
  </namedCache>
</infinispan>
quickstart.batを参考にコピーして作成した、jdbcStoreTest.batです。
set CLASSPATH=".\target\classes"
set DEPEND=(...省略...)\infinispan\infinispan-quickstart\embedded-cache-jdbc\target\dependency
set CLASSPATH=%CLASSPATH%;"%DEPEND%\infinispan-core-5.1.0.CR2.jar"
rem set CLASSPATH=%CLASSPATH%:"%DEPEND%\infinispan-core-5.1.0.CR2.jar"
set CLASSPATH=%CLASSPATH%;"%DEPEND%\jboss-logging-3.1.0.CR1.jar"
set CLASSPATH=%CLASSPATH%;"%DEPEND%\jboss-marshalling-1.3.0.GA.jar"
set CLASSPATH=%CLASSPATH%;"%DEPEND%\jboss-marshalling-river-1.3.0.GA.jar"
set CLASSPATH=%CLASSPATH%;"%DEPEND%\jboss-transaction-api-1.0.1.GA.jar"
set CLASSPATH=%CLASSPATH%;"%DEPEND%\jgroups-3.0.1.Final.jar"
set CLASSPATH=%CLASSPATH%;"%DEPEND%\rhq-pluginAnnotations-3.0.4.jar"
set CLASSPATH=%CLASSPATH%;"%DEPEND%\stax2-api-3.1.1.jar"
set CLASSPATH=%CLASSPATH%;"%DEPEND%\staxmapper-1.0.0.Final.jar"
set CLASSPATH=%CLASSPATH%;"%DEPEND%\woodstox-core-asl-4.1.1.jar"
set CLASSPATH=%CLASSPATH%;"%DEPEND%\infinispan-cachestore-jdbc-5.1.7.Final-redhat-1.jar"
set CLASSPATH=%CLASSPATH%;"%DEPEND%\postgresql-8.2-512.jdbc4.jar"

java -classpath %CLASSPATH% org.infinispan.quickstart.embeddedcache.JdbcStoreTest
動かすと以下の図のようにローカルのpostgresql上にテーブルが自動で作成されます。
また、テーブル上のデータを確認しますと、登録したデータが永続化されていることがわかります。

以上で簡単ですが、JDBCでのリレーショナルデータベースとの接続を行ってみました。この方法ではデータベースのテーブル名、カラム名、型等が設定できますので、KVをリレーショナルデータベースに永続化する仕組みとしては使えそうです。リレーショナルデータベースとの連携というとレガシーシステムが持つデータをキャッシュしたいといった用途が思い浮かびます。が、データストア自体には複雑なマッピングをする機能は無さそうなので、別途用意する必要がありそうです。

[参考]

RedHat社のMartin Gencur氏がcarmartをjdbc対応にしたサンプルを公開しているようなのでそちらを参考資料としてあげます。carmart-tx-jdbcはtomcatのコネクションプールを使用するサンプルとなっているようです

1 件のコメント: