Infinispan 5.3 부터는 MongoDB 를 캐시 저장소로 사용이 가능하더군요. 캐시 중에 영구 저장소에 저장해야 할 경우이면서, 빠른 PUT 성능이 필요로 하는 곳에 쓰면 좋을 것 같습니다.
우선 저는 Infinispan을 Hibernate 2nd cache 로 사용하기도 하는데요, RDBMS 보다야 캐시가 빠르지만, 보통은 휘발성이라 중간 접점이 있으면 좋겠다 싶었는데, Infinispan이 저장소로 NoSQL 을 사용할 수 있다면, 더 좋겠다 싶더군요.
제가 보통 이런 것의 사용처로는 통계성 데이터의 백데이터를 하루나 일주일 정도 캐시에 남겨 놓는 것입니다. 메모리가 제한적이니, NoSQL 에 저장했다가 거기서 로드해서 사용하고, RDBMS 는 처음 읽기만 하고 더 이상 접근하지 않는다면 좋겠다 싶어서지요.
그럼 Infinispan 과 MongoDB 를 활용해서 캐시를 사용해 보도록 하겠습니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- Infinispan --> | |
<dependency> | |
<groupId>org.infinispan</groupId> | |
<artifactId>infinispan-core</artifactId> | |
<version>${infinispan.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>org.infinispan</groupId> | |
<artifactId>infinispan-spring</artifactId> | |
<version>${infinispan.version}</version> | |
</dependency> | |
<dependency> | |
<groupId>org.infinispan</groupId> | |
<artifactId>infinispan-lucene-v3</artifactId> | |
<version>${infinispan.version}</version> | |
</dependency> | |
<!-- Infinispan cacheStore MongoDB --> | |
<dependency> | |
<groupId>org.infinispan</groupId> | |
<artifactId>infinispan-cachestore-mongodb</artifactId> | |
<version>${infinispan.version}</version> | |
</dependency> |
우선 infinispan-core, infinispan-cachestore-mongodb 를 maven dependency 에 추가합니다. 현재 가장
최신 버전은 5.3.0.Final 입니다.
코드는 Infinispan을 사용하는 것과 같고, 다만 CacheStore를 설정해주는 부분만 새로 추가하면 됩니다.
여기서는 ConfigurationBuilder 를 이용하여 MongoDB CacheStore 설정을 수행했습니다.
MongoDbAsCaceStoreTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@Test | |
@SuppressWarnings("unchecked") | |
public void configurationTest() throws InterruptedException { | |
ConfigurationBuilder builder = new ConfigurationBuilder(); | |
builder.loaders().addStore(MongoDBCacheStoreConfigurationBuilder.class) | |
.host("localhost") | |
.port(27017) | |
.timeout(2000) | |
.acknowledgment(0) | |
.database("infinispan_cachestore") | |
.collection("entries"); | |
final Configuration config = builder.build(true); | |
MongoDBCacheStoreConfiguration store = (MongoDBCacheStoreConfiguration) config.loaders().cacheLoaders().get(0); | |
DefaultCacheManager manager = new DefaultCacheManager(); | |
manager.defineConfiguration("entries", config); | |
Cache cache = manager.getCache("entry"); | |
assertThat(cache).isNotNull(); | |
for (int i = 0; i < 5000; i++) { | |
cache.put("Element-" + i, "Value-" + i); | |
} | |
Thread.sleep(100); | |
assertThat(cache.get("Element-0")).isEqualTo("Value-0"); | |
manager.stop(); | |
} |
보안을 위해서 username, password 도 설정이 가능합니다.
좀 더 자세한 내용은 Infinispan CacheStore 를 참고하세요.
참 MongoDB 에 접속하기 위해 Java 용 Driver 도 dependency에 추가해 주세요.
댓글 없음:
댓글 쓰기