この項では、CacheStore/CacheLoader構成について説明します。
TopLink GridのCacheStore/CacheLoader構成では、JPAを使用してクラスをマッピングできますが、Coherenceキャッシュとの対話にはCoherence APIを使用できます。これにより、Coherenceがデータベースと対話できます。
また、Coherenceのライトビハインド構成を使用して、CacheStore/CacheLoader構成とともに非同期書込みを使用することもできます。
一般的な処理は次のとおりです。
CacheLoaderを介して、すべての読取り操作でデータベースからオブジェクトが取得されます。「オブジェクトの読取り」を参照してください。
CacheLoaderを介して、すべての書込み操作でデータベースが更新されます。「オブジェクトの書込み」を参照してください。
詳細な例については、「例」を参照してください。
CoherenceのCacheStore/CacheLoaderでは、すべての読取り操作はTopLink CacheLoader
によってデータベースに送られます。
この図は、グリッド読取り構成における問合せを示しています。
アプリケーションがget
問合せを発行します。
CoherenceがCacheLoaderを使用してTopLinkから問合せをロードします。
TopLinkがデータベースを問合せします。
CoherenceのCacheStore/CacheLoaderでは、TopLinkがCacheStore
を介してすべてのデータベース書込み(挿入、更新、削除)を実行します。
この図は、グリッド読取り構成における問合せを示しています。
アプリケーションがput
問合せを発行します。
CoherenceがCacheStoreを使用してTopLinkから問合せを格納します。
TopLinkがオブジェクトをデータベースに挿入します。
キャッシュ構成(coherence-cache-config.xml
)で、この例に示すようにキャッシュを定義します。
例1 キャッシュの構成
<cache-config> <caching-scheme-mapping> <cache-mapping> <cache-name>Employee</cache-name> <scheme-name>distributed-eclipselink</scheme-name> </caching-scheme-mapping> </caching-scheme-mapping> <caching-schemes> <distributed-scheme> <scheme-name>distributed-eclipselink</scheme-name> <service-name>EclipseLinkJPA</service-name> <backing-map-scheme> <read-write-backing-map-scheme> <internal-cache-scheme> <local-scheme /> </internal-cache-scheme> <!-- Define the cache scheme --> <cachestore-scheme> <class-scheme> <!-- Since the client code is using Coherence API we need the "standalone" version of the cache loader --> <class-name>oracle.eclipselink.coherence.standalone.EclipseLinkJPACacheStore</class-name> <init-params> <init-param> <param-type>java.lang.String</param-type> <param-value>{cache-name}</param-value> </init-param> <init-param> <param-type>java.lang.String</param-type> <param-value>employee</param-value> </init-param> </init-params> </class-scheme> </cachestore-scheme> </read-write-backing-map-scheme> </backing-map-scheme> <autostart>true</autostart> </distributed-scheme> </caching-schemes></cache-config>
例2では、従業員情報を設定し、新しいオブジェクトをCoherenceに追加しています。これにより、CacheStore
に対してINSERTが発行されます。
例2 オブジェクトの挿入
Employee employee = new Employee(); employee.setId(NEW_EMP_ID); employee.setFirstName("John"); employee.setLastName("Doe"); // Putting a new object into Coherence will result in an INSERT in the CacheStore employeeCache.put(NEW_EMP_ID, employee);
オブジェクトをキャッシュから取得した場合、SQL文は生成されません。キャッシュ内にないオブジェクトを取得した場合、SELECT
文が生成されます。
図3 オブジェクトの読取り
// Getting an object from cache produces no SQL System.out.println("New Employee from cache is: " + employeeCache.get(NEW_EMP_ID)); // Getting an object not in cache will produce a SELECT in the CacheStore System.out.println("Non-existant Employee from cache is: " + employeeCache.get(NON_EXISTANT_EMP_ID));