JBoss EAP & Wildfly

JBoss Datagrid 퍼시스턴스 구성

Infinispan 에 저장된 데이터가 예기치 못한 장애나 서버 작업으로 인하여 유실되었을 경우를 대비해 File이나 DB 로 Persistence 하게 저장할 수 있도록 하는 Persistence 와 캐시스토어 설정과 사용방법에 대해 예제를 통하여 살펴봅니다. 
이 예제는 Infinispan 6.0.1 버전을 기반으로 하였으며, JBoss Data Grid 버전으로는 6.2.0 버전에 해당합니다.
 
참조로 Infinispan 과 JBoss Data Grid 간의 버전 맵핑은 아래의 테이블에서 참조합니다.
JBoss Datagrid

Persistence 캐시 스토어 컴포넌트

Infinispan의 In-Memory 에 저장된 데이터를 영구히 저장하고 읽어 오는 방법으로 Persistence와 캐시 스토어를 설정할 수 있습니다.
persistence – 캐시에 데이터가 없는 경우 Persistence 데이터 저장소로 부터 데이터를 로드합니다.
캐시 스토어 ( Cache Store) – 캐시 로더를 확장 한 것으로 Persistence 데이터 저장소에 데이터를 저장하는 기능을 합니다.
캐시 저장소 유형 – 캐시 저장소 타입에는 다음과 같은 것들이 있습니다.

  • File System Based Cache Stores : 파일 기반 캐시 스토어
  • Remote Cache Stores : 리모트 캐시 스토어
  • Custom Cache Stores : 사용자 정의형 캐시 스토어
  • LevelDB Cache Store : LevelDB 캐시 스토어
  • JDBC 기반 캐시 스토어 : JdbcBinaryCacheStore, JdbcStringBasedCacheStore, JdbcMixedCacheStore

이 예제에서는 stringKeyedJdbcStore 를 이용하여 PostgreSQL DB로 Persistence 저장합니다.

실습 – Infinispan 6.0.1 ( JBoss Data Grid 6.2) 에서 Persistence 를 위한 캐시 로더와 캐시 스토어 설정하기

1. 개발 환경 구성

1-1. Eclipse 개발 환경

JDBC Cache Store 를 위한 샘플 프로젝트의 형태는 아래의 그림과 같습니다.
pom.xml 파일을 작성하여 Eclipse Maven Project 로 프로젝트를 구성합니다.
Cache에 대한 정의와 DB Persistence 설정을 위한 JdbcStoreTest.xml 파일과 Cache 에 Put/Get 을 하기 위한 자바 클래인 JdbcStoreTest.java 를 작성합니다.
Datagrid JDBC Cache Store

1-2. pom.xml 작성

Maven 프로젝트에 대한 artifact는 MyFirstDatagrid 라는 이름으로 버전 0.0.1-SNAPSHOT으로 생성하였습니다.
pom.xml 파일 내용은 아래와 같습니다.


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>MyFirstDatagrid</groupId>
<artifactId>MyFirstDatagrid</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<version.org.infinispan>6.0.1.Final</version.org.infinispan>
<version.org.postgresql>9.1-901.jdbc4</version.org.postgresql>
</properties>

<dependencies>
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-core</artifactId>
<version>${version.org.infinispan}</version>
</dependency>
<dependency>
<groupId>org.infinispan</groupId>
<artifactId>infinispan-cachestore-jdbc</artifactId>
<version>${version.org.infinispan}</version>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${version.org.postgresql}</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
</dependencies>
</project>

2. XML 로 namedCache 정의하기

JdbcStoreTest.xml 파일에 캐시로더와 캐시스토어로 stringKeyedJdbcStore 를 사용하며 PostgreSQL DB 에 저장하고 로드하게 됩니다.

<?xml version="1.0" encoding="UTF-8"?>
<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:infinispan:config:6.0 http://www.infinispan.org/schemas/infinispan-config-6.0.xsd
                            urn:infinispan:config:jdbc:6.0 http://www.infinispan.org/schemas/infinispan-cachestore-jdbc-config-6.0.xsd"
xmlns="urn:infinispan:config:6.0">
<namedCache name="persistentCache">
<persistence passivation="false">
<stringKeyedJdbcStore xmlns="urn:infinispan:config:jdbc:6.0"
fetchPersistentState="false" ignoreModifications="false"
purgeOnStartup="false">
<connectionPool connectionUrl="jdbc:postgresql://localhost:5432/postgres"
driverClass="org.postgresql.Driver" username="infinispan" password="infinispan" ></connectionPool>
<stringKeyedTable prefix="ISPN_STRING_TABLE"
createOnStart="true" dropOnExit="false">
<idColumn name="ID_COLUMN" type="VARCHAR(255)" ></idColumn>
<dataColumn name="DATA_COLUMN" type="bytea" ></dataColumn>
<timestampColumn name="TIMESTAMP_COLUMN" type="BIGINT" ></timestampColumn>
</stringKeyedTable>
</stringKeyedJdbcStore>
</persistence>
<transaction
transactionManagerLookupClass="org.infinispan.transaction.lookup.DummyTransactionManagerLookup"
transactionMode="TRANSACTIONAL" lockingMode="OPTIMISTIC" ></transaction>
</namedCache>
</infinispan>

3. 캐시를 사용하는 자바 애플리케이션 코드 작성하기

코드의 내용은 “JdbcStoreTest.xml” 파일에서 “persistentCache”에 대한 정의 내용을 읽고 stringKeyedJdbcStore 로 정의된 PostgreSQL 에 저장된 데이터를 로딩하게 됩니다.
최초 실행 시에는 데이터베이스에 저장된 데이터가 없기 때문에 “cache.get()” 실행 시 “null” 이 출력 됩니다. 다음 로직이 1~100 까지 “cache.put”을 수행하게 되고
cache 에 데이터가 저장됨과 동시에 JDBC 를 통하여 PostgreSQL DB 에도 데이터가 저장되게 됩니다.
애플리케이션을 두 번째 실행하게 되면 첫 번째 실행 시 DB 캐시 스토어에 저장되었던 데이터가 출력되어 최초 “null” 값이 아닌 “value99” 형태로 순차적으로 값이 출력됩니다.

JdbcStoreTest.java 코드는 아래와 같습니다.


package infinispan.sample;

import org.infinispan.Cache;
import org.infinispan.manager.DefaultCacheManager;

public class JdbcStoreTest {
public static void main (String args []) throws Exception {
Cache cache = new DefaultCacheManager ( "JdbcStoreTest.xml").getCache("persistentCache");
for (int i = 1; i <= 100; i++) {
     System.out.println ( "Key ="+ java.lang.Integer.toString (i) + ", Value ="+ cache.get (java.lang.Integer.toString (i)));
}

for (int i=1; i<=100; i++) {
     cache.put (java.lang.Integer.toString (i), "value"+ java.lang.Integer.toString (i));
}
}
}

&#91;/code&#93;
&#91;/av_textblock&#93;
&#91;/av_one_full&#93;

&#91;av_one_full first min_height='' vertical_alignment='' space='' custom_margin='' margin='0px' padding='0px' border='' border_color='' radius='0px' background_color='' src='' background_position='top left' background_repeat='no-repeat' animation='' mobile_display=''&#93;

&#91;av_heading tag='h3' padding='10' heading='4. 작성된 애플리케이션 실행하기 ' color='' style='' custom_font='' size='' subheading_active='' subheading_size='15' custom_class='' admin_preview_bg=''&#93;&#91;/av_heading&#93;

&#91;av_heading heading=' 4-1. Eclipse 에서 실행하기' tag='h4' style='' size='' subheading_active='' subheading_size='15' padding='10' color='' custom_font='' admin_preview_bg=''&#93;&#91;/av_heading&#93;

&#91;av_textblock size='' font_color='' color='' admin_preview_bg=''&#93;
JdbcStoreTest 클래스를 Java Application 으로 실행합니다.

&#91;code language="bash"&#93;

3월 17, 2014 10:24:15 오후 org.infinispan.factories.GlobalComponentRegistry start
INFO: ISPN000128: Infinispan version: Infinispan 'Infinium' 6.0.1.Final
3월 17, 2014 10:24:16 오후 com.mchange.v2.log.MLog <clinit>
... 중략 
3월 17, 2014 10:24:17 오후 org.infinispan.jmx.CacheJmxRegistration start
INFO: ISPN000031: MBeans were successfully registered to the platform MBean server.
Key =1, Value =value1
Key =2, Value =value2
... 중략 

4-2. Postgres 에 저장된 데이터 확인해 보기

최초 실행 후에는 Persistence 데이터가 PostgreSQL 에 저장된 것을 확인 할 수 있습니다.
stringKeyedJdbcStore 형태로 캐시스토어를 사용하게 되면 데이터베이스에는 key 값을 Primary 로 하여 Value 는 Binary 로 저장됩니다.
JBoss data Grid JDBC Cache Store

각 레코드는 아래의 그림과 같이 저장됩니다.

거침없이 배우는 JBoss10점
전준식 엮음/지&선(지앤선)