この章では、TopLinkのライブ・データ問合せ(ライブ問合せ)を使用して、バッキング・データ・ストアで変更を監視し、その後クライアント・アプリケーションに非同期的に変更されたすべてのデータを送信する方法を説明します。
この章の内容は次のとおりです。
ユース・ケース
TopLinkが有効なアプリケーションで問合せを実行すると、バッキング・データ・ストアのデータを追加、変更または削除できます。問合せを再実行せずに、更新に関する情報がアプリケーションで受信されることが重要です。
解決方法
TopLinkのライブ問合せをOracle Database連続問合せ通知(CQN)とともに使用して、データの変更をクライアントに通知するためにマージ・トラッキングをキャッシュします。
コンポーネント
Oracle 11gR2 (11.2) (以上の)データベース
TopLink 12c (12.1.2.0.0)以上。
注意: TopLinkのコア機能は、Eclipse Foundationのオープン・ソースの永続性フレームワークであるEclipseLinkが提供していますが、TopLinkのライブ・データはOracle TopLinkでのみ利用できます。 |
例
Oracle WebLogic Server WebソケットでTopLinkライブ問合せを使用する例については、http://www.oracle.com/toplink/
でtlds.live.ws
の例を参照してください。
TopLinkのライブ問合せをOracle Database連続問合せ通知(CQN)とともに使用すると、バッキング・データ・ストアの変更をクライアント・アプリケーションに非同期的に通知するためにTopLinkでマージ・トラッキングをキャッシュできます。データベース(およびオプションでキャッシュ)では、問合せの基準と一致するデータ変更が監視され、それらの変更はクライアントに返されます。
CQNは、アプリケーションが変更通知をデータベースに対して登録することを許可するOracle Databaseの機能です。問合せを登録すると、問合せの結果がトランザクションによって変更されると、アプリケーションにデータベースから通知されるようにできます。この種類のCQN通知は、問合せ結果変更通知(QRCN)といいます。
注意: 11g以前のOracle Databaseリリースでは、変更通知機能はデータベース変更通知(DCN)と呼ばれていました。リリース11gでは、Oracle Database連続問合せ通知(CQN)に名前が変更されています。 |
TopLinkライブ問合せではQRCNを利用し、問合せに指定した基準と一致するデータに対する変更が、クライアント通知の実装を介してアプリケーションに返されるようになっています。
注意: 最初の問合せの実行と変更結果へのサブスクライブは、2つの操作で行う必要があります。 |
CQNおよびQRCNの詳細は、『Oracle Database開発者ガイド』の連続問合せ通知(CQN)の使用に関する項を参照してください。特に、問合せ結果変更通知(QRCN)に関する項を参照してください。
キャッシュに対するサブスクリプションはoracle.toplink.dataservices.livedata.cache.CacheSubscriptionProvider
クラスを介して提供されます。
問合せに名前を付け、データベース(オプションでキャッシュ)のイベントに基づいて通知をサブスクライブし、プロパティ・オブジェクトを介してサブスクリプションを構成します。
ライブ・データ問合せを設定する主な手順は次のとおりです。
ClientNotifier
インタフェースの実装を定義する。
QRCNサブスクリプションを構成するプロパティ・オブジェクトを作成する。
QRCN通知をサブスクライブする。
使用する名前付き問合せの名前を指定する。QRCNによってサポートされている問合せの種類のガイドラインについては、『Oracle Database開発者ガイド』の連続問合せ通知(CQN)の使用に関する項を参照してください。
問合せのパラメータを指定します。
サブスクリプションを作成します。
サブスクリプションにClientNotifier
の実装を追加します。
ClientNotifier
の実装を作成および追加します。
通知をサブスクライブするには、データベースのイベントに基づくのみでなく、キャッシュ内のイベントに基づいて通知をサブスクライブすることも可能です。キャッシュ・サブスクリプションは、データベース・サブスクリプションで使用しているのと同じ、問合せ、パラメータおよびClientNotifier
を使用して作成します。
この項では、データ変更をクライアントに通知するTopLinkライブ問合せを設定および使用する次のタスクについて説明します。
ライブ問合せを使用するには、次が必要です。
Oracle Database 11.2.0.2以上
TopLink 12c (12.1.2.0.0)以上。
他の許可に加え、データベース・ユーザーには、CHANGE NOTIFICATION
権限が付与されている必要があります。これを実行するには、SYS
などのDBA権限を持っているか、データベース管理者にそれを適用してもらう必要があります。
grant change notification to
user
Oracle Databaseの権限の付与の詳細は『Oracle Databaseセキュリティ・ガイド』の権限とロール認可の構成に関する項を参照してください。
例21-1の例に従って、ライブ・データ問合せおよびCQNサブスクリプションを作成します。この例では、特定のPersistenceContext
でCQN通知のサブスクリプションを定義するクラス定義の部分を示します。
注意: 完全なクラス定義には、クライアントに通知するコード(およびオプションでロギング)も含まれます。これについては、この章では説明しません。 |
例21-1 TopLinkライブ・データ問合せのCQN通知へのサブスクリプション
... // Import TopLink Live Data classes import oracle.toplink.dataservices.DataServicePersistenceContext; import oracle.toplink.dataservices.livedata.Subscription; import oracle.toplink.dataservices.livedata.SubscriptionFactory; import oracle.toplink.dataservices.livedata.cache.CacheSubscriptionProvider; import oracle.toplink.dataservices.livedata.notification.ClientNotifier; import oracle.toplink.dataservices.livedata.notification.Notification; import oracle.toplink.dataservices.livedata.notification.NotificationType; import oracle.toplink.dataservices.livedata.qcn.QCNSubscriptionProvider; import weblogic.websocket.WebSocketConnection; ... // Client notifier code--- class Notifier implements ClientNotifier { // The implementation of the client notifier) ... } // Notification subscription code--- // The name of the query. private String queryName; // The parameters associated with the query. private Map<String, String> parameters; // The persistence context that this CQN notifier listens to. private DataServicePersistenceContext persistenceContext; // Returns the query parameters associated with this notifer. Map<String, String> getParameters() { return this.parameters; } // Returns the name of the query that this notifier listens to. String getQueryName() { return this.queryName; } // Subscribe with the associated PersistenceContext, to listen to query result change events. public void subscribe() { // properties object for configuation of the subscription Map<String, Object> properties = new HashMap<String, Object>(); // subscribe to notifcation through Oracle CQN properties.put(SubscriptionFactory.SUBSCRIPTION_TYPE, QCNSubscriptionProvider.QCN); properties.put(CacheSubscriptionProvider.QUERY_PARAMETERS, this.parameters); properties.put(CacheSubscriptionProvider.QUERY_NAME, this.queryName); Subscription subscription = this.persistenceContext.getSubscriptionFactory(). getOrCreateSubscription(this.queryName, properties); // Register for QRCN subscription subscription.addClientNotifier(this); properties.put(SubscriptionFactory.SUBSCRIPTION_TYPE, CacheSubscriptionProvider.CACHE); subscription = this.persistenceContext.getSubscriptionFactory(). getOrCreateSubscription(this.queryName, properties); // Register for cache subscription subscription.addClientNotifier(this); } public String toString() { return "Notifier [query = " + this.queryName + "]"; } // Unsubscribe from the PersistenceContext listening to query result change events. */ public void unsubscribe() { Map<String, Object> properties = new HashMap<String, Object>(); properties.put(SubscriptionFactory.SUBSCRIPTION_TYPE, QCNSubscriptionProvider.QCN); properties.put(CacheSubscriptionProvider.QUERY_PARAMETERS, this.parameters); properties.put(CacheSubscriptionProvider.QUERY_NAME, this.queryName); Subscription subscription = this.persistenceContext.getSubscriptionFactory().getSubscription(this.queryName, this.parameters); subscription.removeClientNotifier(this); } // Update the object with changes public void updatedObject(Object updatedObject) { sendMessage(updatedObject, NotificationType.UPDATE); }
TopLinkライブ・データ問合せの詳細は、次を参照してください。
Oracle Databaseで変更通知を使用する方法の詳細は、『Oracle Database開発者ガイド』の連続問合せ通知(CQN)の使用に関する項を参照してください。