ODP.NETおよびOracle Database 11gでのDatabase Change Notificationの使用
目的このチュートリアルでは、Oracle Data Provider for .NETおよびOracleデータベースでサポートされているDatabase Change Notification機能について紹介します。 所要時間約30分 トピックこのチュートリアルでは、以下のトピックについて説明します。
スクリーンショットの表示
注: 各手順に関連したスクリーンショットのみをロードして表示する場合は、それぞれの手順にあるアイコンの上にカーソルを置いてください。 個々のスクリーンショットはクリックすると、非表示になります。 概要Oracle Data Provider for .NETには、データベース・サーバーにおけるDatabase Change Notificationをサポートする通知フレームワークがあります。 Database Change Notificationを使用すると、問合せ結果セット、スキーマ・オブジェクト、またはデータベースの状態(キャッシュされたクライアント結果セットに影響を与える可能性がある)に変更が生じた場合に、登録したコールバック・ルーチンによりアプリケーションが通知を受け取ることができます。 この機能をODP.NETで使用すると、アプリケーションはクライアント側キャッシュ(たとえば、ADO.NETデータセット)を有効に利用することができます。 クライアントは、データベースへの接続を維持する必要はありません。 クライアントは、データベースに接続していない場合でも通知を受け取ることができます。 この機能の目的は、時間の経過とともに結果が時折変更される問合せや、大量のアクティブなデータベース接続を維持できないときの対応にあります。 このチュートリアルでは、アプリケーションにHR.EMPLOYEES表の値を含んでいるデータセット・グリッドが表示されます。 グリッドを移入すると、アプリケーションはデータベースから切断され、データが変更されたという通知を待ちます。 変更が検出されると、アプリケーションはデータベースに再接続して、データをリフレッシュします。 このチュートリアルでは、Database Change Notification機能の柔軟性を示すために、大量の変更がおこなわれたあとでも引き続き通知が登録される例や、変更がクライアントの問合せ結果に影響を与えるかどうかを行レベルで識別する例を紹介します。 この機能は、Oracle Database 10g Release 2ではDatabase Change Notification(DCN)と呼ばれています。Oracle
Database 11gでは、この機能はContinuous Query Notification(CQN)に名前が変更されています。 これらの名前はいずれも同じ機能を指しています。 前提条件このチュートリアルを始める前に以下を確認してください。
HRへの権限付与ユーザーまたはロールにCHANGE NOTIFICATION権限が設定されていないと、変更通知コールバックを受け入れるアプリケーションを実行できません。
変更通知デモ・アプリケーションのロードと実行変更通知のVisual Studioソリューションは、ユーザーがロードおよび実行できるように事前に作成されています。 このプログラムは、HRスキーマ内のEMPLOYEES表からEMPLOYEE_IDの値が200未満のすべてのレコードを選択し、結果をADO.NETデータセットに設定します。 データセットはデータベース・サーバーへの接続を維持しないので、データベース・リソースを使用し続けることはなく、スケーラビリティが向上します。 SELECT文を実行する前に、OracleDependencyオブジェクトがOracleCommandにバインドされます。 SELECT文を実行すると、このOracleDependencyによって、データベース・サーバーに通知登録が作成されます。 もとのデータセットが切断されていても、別のユーザーがEMPLOYEES表を変更した場合、ソース・データに変更が加えられたことが通知ハンドラによって.NETアプリケーションに通知されます。 この際、クライアント側ではイベント・ハンドラが起動し、データセットの結果がリフレッシュされます。
Employees表の変更および変更通知イベントの発生の確認
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 1. | Server Explorerで横にある(+)プラス記号をクリックし、「HR.ORCL」を開きます。 次に、「Tables」ノードを開きます。 EMPLOYEES表を右クリックして、「Retrieve Data...」を選択し、そのデータをVisual Studioに表示します。
Microsoft Visual Studioダイアログ・ボックスに、100に設定されている最大行数よりも多くの行を取得するかどうかを尋ねるメッセージが表示された場合は、「Yes」をクリックします。
ウィンドウが開いて、従業員表のデータが表示されます。
|
| 2. | Visual Studioで新たに開いたデータ・ウィンドウ(変更通知アプリケーション・グリッド内ではありません)で、SALARY値の1つを変更します。 「Save」をクリックすると、値がOracleデータベースにコミットされます。
|
| 3. | 数秒すると、変更通知アプリケーションによって、Notification Alertウィンドウが開き、結果セットが変更されたことが示されます。 注:このウィンドウが表示されない場合は、デスクトップ下部にあるタスクバーを確認してください。 タスクバーは非表示になっている場合があります。 (このウィンドウが表示される前にブレーク・ポイントにヒットした場合は、[F5]を押して続行します。)
「OK」をクリックします。 Oracle Database Change Notificationのデモを閉じます。 |
現時点では、アプリケーションは変更通知コールバックを受け取っていますが、イベント・ハンドラには前のセクションで見たダイアログ・ボックス以外は何も含まれていません。 コードを追加して、データベースに接続し、変更された行をフェッチします。
単一表のSELECTの場合、変更通知コールバックからは、その表内の変更されたすべての行に対するROWID情報が返されます。 ROWIDはもとの問合せに追加されるため、変更された行だけを取得でき、データセット全体を取得するより有利です。 その後、新しいデータだけを使用してデータセットをリフレッシュします。
| 1. | 「Form1.cs」タブをクリックします。 ドロップダウン・ボックスで、「OnMyNotificaton(.. 」を選択します。 これで、OnMyNotificatonコールバック・ルーチンに入ります。
|
| 2. | それぞれのコメントの下に次の一連のコードを追加します。 コメントでは、コードの各行の機能を説明します。 次の一連のコードは、変更された行だけを取得するために、基本の問合せにROWIDを追加します。 DataRow detailRow = args.Details.Rows[0];
for (int i = 1; i < args.Details.Rows.Count; i++) { detailRow = args.Details.Rows[i]; rowid = detailRow["Rowid"].ToString(); sqlUpdate = sqlUpdate + " or rowid = \'"+ rowid +"\'"; }
|
| 3. | 次の一連のコードを追加して、データをリフレッシュします。 OracleConnection con2 = new OracleConnection(constr); OracleCommand cmd2 = new OracleCommand(sqlUpdate,con2);
|
| 4. | Buildメニューから、「Build Solution」を選択します。 エラーや警告がないことを確認します。
|
| 5. | Debugメニューから、「Start Debugging」を選択します。 HR.EMPLOYEES表の値を含んでいる グリッドが表示されます。
|
| 6. | これで、データベース内の複数の行を変更し、ODP.NETが変更された行だけを更新することを確認できます。 Solution Explorerで、「multiple_row_change.sql」をダブルクリックします。
|
| 7. | multiple_row_change.sqlから次の行を選択します。 [CTRL]+[C]を押して、コードをコピーします。 update employees set salary=salary+10 where employee_id=100 or employee_id=101;
commit;
|
| 8. | Notification Alertが表示されます。 「OK」をクリックします。
アプリケーション・グリッドで、変更された行がリフレッシュされたことを確認します。
注:Oracleデータベースは、各行のROWIDで変更された行を識別します。 OracleNotificationEventArgsインスタンスは、ROWID情報をODP.NETに返します。表全体ではなく、変更された行だけが取得されます。 これにより、まだ有効なデータがリフレッシュされないようアプリケーションを保護します。 また、データベースのそれぞれの異なる変更に対して1つの通知が送られます。 2つの行が変更されたとしても、変更は1つの個別イベントとして発生します。 そのため、送信される通知は1つのみです。 Oracle Database Change Notificationデモ・ウィンドウを閉じます。 |
Oracle Database 11g以降、ODP.NETは、そのデータベースへの問合せを登録し、オブジェクト変更通知または結果セット変更通知を受け取れるようになりました。
オブジェクト変更通知は、問合せに関連づけられたオブジェクト(表など)へのDMLまたはDDLによる変更によって作成されます。 結果セット変更通知(デフォルト)は、問合せに関連づけられた特定の結果セット行へのDMLまたはDDLによる変更によって作成されます。
結果セット変更通知は、選択した特定の結果セットにのみ焦点を合わせることで、クライアント・アプリケーションに対してより詳細な情報を提供しますが、オブジェクト変更通知ハンドラは、より負荷が軽くなっています。
注:チュートリアルのこの部分は、ODP.NET 11gおよびOracle Database 11gを使用している場合のみ実行できます。
| 1. | Visual Studioメニューから、「Debug」→「Start Debugging」を選択します。 Oracle Database Change Notificationデモ・ウィンドウに、従業員レコードが表示されます。 ここで、データベース内の複数の行を変更します。 ODP.NETは、変更された行だけを更新します。 まだ開いていない場合は、Solution Explorerから「multiple_row_change.sql」を開きます。
|
| 2. | multiple_row_change.sqlから次の行を選択します。 [CTRL]+[C]を押して、コードをコピーします。 Update employees set salary=salary+10 where employee_id=200 or employee_id=201;
実行しても、Notification Alertウィンドウは表示されません。 このupdate文はもとの問合せの対象外にある行に作用するので、データベース通知ハンドラは何のアクションも起こさないためです。
|
このチュートリアルで学習した内容は、次のとおりです。
| HRへの変更通知権限の付与 | ||
| 変更通知デモ・アプリケーションのロードと実行 | ||
| Employees表の変更および変更通知イベントの発生の確認 | ||
| 変更通知イベントを処理するためのコールバック・ルーチンの追加 | ||
| 結果セット変更通知の使用 | ||