読者です 読者をやめる 読者になる 読者になる

#chiroito ’s blog

Java を中心とした趣味の技術について

Coherenceでのオブジェクトの扱い

CoherenceのNameCacheをMapと同じ感覚で使うと、取得するたびにオブジェクトが異なるので思いもよらない問題が発生しそうなのでブレークしながら検証しておきます。

目的

Coherenceのキャッシュからとれるオブジェクトが毎回異なることを検証する

環境

先日作ったS2JDBCを使います。
Coherence+S2JDBC CacheLoader,CacheStore編
・Java 6.0
・Seasar 2.4.43
・Coherence 3.6.1
・Eclipse Java EE IDE for Web Developers.Helios Service Release 1

検証用サンプルソース

package com.chirokings;

import java.math.BigDecimal;

import com.chirokings.entity.Employee;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;

public class CacheTest {

public static void main(String[] args) {
NamedCache cache = CacheFactory.getCache("VirtualCache");
String sourceKey = "key";
String someKey = "key";

Employee sourceValue = new Employee();
cache.put(sourceKey, sourceValue);
Employee value1 = (Employee) cache.get(sourceKey);
Employee value2 = (Employee) cache.get(someKey);

value1.age = new BigDecimal(27);

cache.put(sourceKey, value1);
value2 = (Employee) cache.get(someKey);
}
}
まずは
value1:putしたKeyと同じKeyを使用してget(18行目)
value2:putしたKeyと同じオブジェクトIDを持つ異なるKeyを使用してget(19行目)

この2つのケースではcache.getにわたるオブジェクトは同一になります。
単にオブジェクトを入れる箱の名前が異なるだけです。
この結果、putしたオブジェクトと得られた2つのオブジェクトの全てが異なるオブジェクトになっているのが分かります。
図1:19行目まで実行完了

オブジェクトが異なるので当然フィールドを変更しても他のオブジェクトに影響ありません。(21行目)
図2:21行目まで実行完了

変更したオブジェクトを一度キャッシュへputしてvalue2へ取得します。(23,24行目)
すると、またオブジェクトが異なることが分かります。
図3:24行目まで実行完了

結論

同じキーでもgetする度にオブジェクトが異なります。