データベースクエリの結果をキャッシュすると、スクリプトの実行時間を大幅に短縮し、データベースサーバーの負荷を最小限に抑えることができることはよく知られています。この手法は、処理しているデータが基本的に静的である場合に非常にうまく機能します。これは、リモート データベースへの多くのデータ要求は最終的にローカル キャッシュから満たされるため、データベースに接続してクエリを実行し、結果を取得する必要がなくなるからです。
ただし、使用しているデータベースが Web サーバーとは別のマシン上にある場合は、データベースの結果セットをキャッシュすることをお勧めします。ただし、状況に応じて最適なキャッシュ戦略を決定するのは難しい場合があります。たとえば、最新のデータベース結果セットを使用することが重要なアプリケーションの場合、時間トリガーのキャッシュ手法 (有効期限のタイムスタンプに達するたびにキャッシュが再生成されることを前提とするキャッシュ システムで一般的に使用されます) は満足のいく解決策ではない可能性があります。 。この場合、アプリケーションがキャッシュに必要なデータベース データが変更されるたびにアプリケーションに通知し、キャッシュされた期限切れデータとデータベースの一貫性をアプリケーションが保つようにするメカニズムが必要です。このような場合には「データベース変更通知」を利用すると大変便利です。
データベース変更通知の入門
データベース変更通知機能の使用法は非常に簡単です。通知のために実行する通知ハンドラ、つまりPL/SQLストアド・プロシージャまたはクライアントOCIコールバック関数を作成します。次に、変更通知を受け取りたいデータベース オブジェクトに対するクエリを登録します。これにより、トランザクションがその中のオブジェクトを変更してコミットするたびに通知ハンドラーが呼び出されます。通常、通知ハンドラーは、クライアント アプリケーションが応答で適切なアクションを実行できるように、変更されたテーブルの名前、行われた変更の種類、およびオプションで変更された行の行 ID をクライアント リスナーに送信します。
データベース変更通知機能がどのように動作するかを理解するために、次の例を検討してください。 php(現在の主流の開発言語として)アプリケーションが、OE.ORDERSテーブルに保存されている注文とOE.ORDER_ITEMSに保存されている注文品目にアクセスするとします。発注された注文に関する情報がほとんど変更されないことを考慮すると、アプリケーションで ORDERS テーブルと ORDER_ITEMS テーブルの両方に対するクエリの結果セットをキャッシュすることができます。古いデータへのアクセスを回避するには、データベース変更通知を使用します。これにより、上記の 2 つのテーブルに格納されているデータの変更をアプリケーションに簡単に通知できます。
通知を受け取り、これら 2 つのテーブルに対して行われた DML または DDL 変更に応答するには、ORDERS テーブルと ORDER_ITEMS テーブルのクエリを登録する前に、まず CHANGE NOTIFICATION システム権限と EXECUTE ON DBMS_CHANGENOTIFICATION 権限を OE ユーザーに付与する必要があります。これを行うには、SQL*Plus などの SQL コマンド ライン ツールから次のコマンドを実行します。
CONNECT / AS SYSDBA;
GRANT CHANGE NOTIFICATION TO oe;
GRANT EXECUTE ON DBMS_CHANGE_NOTIFICATION TO oe; PL/SQL 通知を受信するには、init.ora パラメータ job_queue_processes がゼロ以外の値に設定されていることを確認してください。あるいは、次の ALTER SYSTEM コマンドを使用することもできます:
operdate DATE,
tblname VARCHAR2(60),
rslt_msg VARCHAR2(100)
); 実際の状況では、通知イベントを記録するためにさらにテーブルを作成する必要がある場合があります。変更された行の行 ID ですが、この記事の目的では、nfresults テーブルで十分です。
UTL_HTTP を使用してクライアントに通知を送信する
また、1 つ以上の PL/SQL ストアド プロシージャを作成し、通知ハンドラからこれらのストアド プロシージャを呼び出して、より保守しやすく柔軟なソリューション プランを実現することもできます。たとえば、クライアントへの通知メッセージを実装するストアド プロシージャを作成するとします。 「リスト 1」は、PL/SQL プロシージャ sendNotification です。このプロセスでは、UTL_HTTPPL パッケージを使用して、クライアント アプリケーションに変更通知を送信します。
リスト 1. UTL_HTTP を使用してクライアントに通知を送信する