シングルトン・パイプを使用したキャッシュ・メッセージ
シングルトン・パイプは、カスタム・メッセージをキャッシュおよび取得し、同時読取りで複数のデータベース・セッション間でメッセージを共有できるDBMS_PIPE
パッケージの追加です。
- シングルトン・パイプを使用したメッセージのキャッシュについて
DBMS_PIPE
パッケージには、シングルトン・パイプをサポートするためのAutonomous Databaseの拡張機能があります。 - キャッシュ関数を使用したキャッシュされたメッセージの自動リフレッシュ
DBMS_PIPE
パッケージを使用すると、ユーザー定義のキャッシュ関数を使用してシングルトン・パイプ・メッセージを自動的に移入できます。 - 明示的シングルトン・パイプの作成
指定されたパイプ名(明示的シングルトン・パイプ)でシングルトン・パイプを作成するステップについて説明します。 - キャッシュ関数を使用した明示シングルトン・パイプの作成
指定されたパイプ名、明示シングルトン・パイプを使用してシングルトン・パイプを作成するステップと、キャッシュ関数を提供するステップについて説明します。キャッシュ関数を使用すると、メッセージをシングルトンパイプに自動的に移入できます。
シングルトン・パイプを使用したメッセージのキャッシュについて
DBMS_PIPE
パッケージには、シングルトン・パイプをサポートするためのAutonomous Databaseの拡張機能があります。
DBMS_PIPE
のシングルトン・パイプ:
-
シングルトン・パイプ・メッセージを使用して、カスタム・データのインメモリー・キャッシュを提供します。
-
最大32,767バイトのカスタム・メッセージをキャッシュおよび取得する機能をサポートします。
-
同時読取りによる複数のデータベース・セッション間でのキャッシュされたメッセージの共有をサポートします。これにより、スループットが高くなり、データベース・セッション間のメッセージの同時読取りがサポートされます。
-
読取り専用データベースおよび読取り専用データベースをサポートします。
-
複数のキャッシュ無効化メソッドをサポートします。
- ユーザーによって制御される明示的なキャッシュ無効化。
- ユーザー指定の時間間隔(秒)後のキャッシュ無効化。この無効化方法は、メッセージ・リーダーではなく、
shelflife
パラメータを使用して、メッセージ・センダーによって制御されます。これにより、リーダーによるキャッシュの使用が正しくないために、一般的な落とし穴を回避できます。
標準パイプとシングルトン・パイプについて
DBMS_PIPEパッケージを使用すると、2つ以上のデータベース・セッションがインメモリー・メッセージを使用して通信できます。パイプ機能には、外部サービス・インタフェース、デバッグ、独立したトランザクション、アラートなどの複数のアプリケーションがあります。
シングルトン・パイプには、サポートされているDBMS_PIPE
タイプのいずれかを指定できます。
- 暗黙的パイプ:
DBMS_PIPE.SEND_MESSAGE
関数を使用して不明なパイプ名でメッセージを送信すると、自動的に作成されます。 - 明示的パイプ:ユーザー指定のパイプ名で
DBMS_PIPE.CREATE_PIPE
関数を使用して作成されます。 - パブリック・パイプ:
DBMS_PIPE
パッケージに対するEXECUTE
権限を持つすべてのユーザーがアクセスできます。 - プライベート・パイプ:パイプ作成者と同じユーザーを持つセッションからアクセスできます。
シングルトン・パイプは、Autonomous Databaseインスタンスのメモリーに単一のメッセージをキャッシュする機能を提供します。
次に、シングルトンパイプを使用する一般的なワークフローを示します。
シングルトンパイプの概要と機能
-
シングルトン・メッセージ
- シングルトンパイプは、パイプに1つのメッセージをキャッシュできるため、「シングルトン」という名前になります。
- シングルトン・パイプ内のメッセージは、複数のフィールドで構成でき、最大メッセージ・サイズは32,767バイトです。
DBMS_PIPE
は、DBMS_PIPE.PACK_MESSAGE
プロシージャを使用して、メッセージ内に複数の属性をパックする機能をサポートしています。- パブリック・シングルトン・パイプの場合、
DBMS_PIPE
パッケージに対する実行権限がある任意のデータベース・セッションでメッセージを受信できます。 - プライベート・シングルトン・パイプの場合、メッセージは、シングルトン・パイプの作成者と同じユーザーのセッションが受信できるようになります。
- 読取りのメッセージ・スループットが高い
- シングルトン・パイプは、無効化されるかパージされるまでパイプにメッセージをキャッシュします。データベース・セッションは、シングルトン・パイプからメッセージを同時に読み取ることができます。
- シングルトンパイプからメッセージを受信することは、非ブロッキング操作です。
- メッセージ・キャッシング
- メッセージは、
DBMS_PIPE.SEND_MESSAGE
を使用してシングルトン・パイプにキャッシュされます。 - シングルトン・パイプにキャッシュされた既存のメッセージがある場合、
DBMS_PIPE.SEND_MESSAGE
は、シングルトン・パイプに1つのメッセージのみを保持するように、前のメッセージを上書きします。
- メッセージは、
- メッセージ無効化
- 明示的無効化: プロシージャ
DBMS_PIPE.PURGE
を使用してパイプをパージするか、DBMS_PIPE.SEND_MESSAGE
を使用してメッセージを上書きします。 - 自動無効化: メッセージは、指定した
shelflife
時間が経過した後に自動的に無効化できます。
- 明示的無効化: プロシージャ
- データベース・メモリーからの削除なし
- シングルトン・パイプは、Oracle Databaseのメモリーから削除されません。
- 明示的シングルトン・パイプは、
DBMS_PIPE.REMOVE_PIPE
を使用して削除するか、データベースの再起動まで、データベース・メモリーに常駐し続けます。 - 暗黙的シングルトン・パイプは、パイプにキャッシュされたメッセージが1つになるまでデータベース・メモリーにとどまります。
シングルトンパイプ操作
操作 | DBMS_PIPEファンクションまたはプロシージャ |
---|---|
明示的なシングルトンパイプを作成する |
|
シングルトンパイプでメッセージをキャッシュする |
|
シングルトンパイプからキャッシュされたメッセージを読み取る |
|
シングルトンパイプでのメッセージの削除 |
|
明示的なシングルトンパイプを削除する |
親トピック: シングルトン・パイプを使用したメッセージのキャッシュ
キャッシュ関数を使用したキャッシュされたメッセージの自動リフレッシュ
DBMS_PIPE
パッケージでは、ユーザー定義のキャッシュ関数を使用して、シングルトン・パイプ・メッセージを自動的に移入できます。
デフォルトでは、シングルトン・パイプの明示的または暗黙的な無効化でメッセージが無効化されると、後続のDBMS_PIPE.RECEIVE_MESSAGE
ではメッセージを受信しません。パイプに新しいメッセージを追加するには、DBMS_PIPE.SEND_MESSAGE
をコールしてメッセージを明示的にキャッシュする必要があります。このような場合、シングルトンパイプから読み取るときにメッセージを使用できないようにするには、キャッシュ関数を定義します。キャッシュ関数を定義すると、次のシナリオでメッセージを受信すると、キャッシュ関数が自動的に起動されます。
- シングルトン・パイプが空の場合
shelflife
の経過時間が原因でシングルトン・パイプ内のメッセージが無効である場合。
キャッシュ・ファンクションを使用するには、キャッシュ・ファンクションを定義し、DBMS_PIPE.RECEIVE_MESSAGE
にcache_func
パラメータを含めます。ユーザー定義キャッシュ・ファンクションは、次の機能を提供します。
- キャッシュ関数は、
DBMS_PIPE.RECEIVE_MESSAGE
を使用してシングルトン・パイプからメッセージを読み取るときに指定できます。 - シングルトン・パイプにメッセージがない場合、
DBMS_PIPE.RECEIVE_MESSAGE
はキャッシュ関数を呼び出します。 - メッセージ
shelflife
の時間が経過すると、データベースはシングルトン・パイプに新しいメッセージを自動的に移入します。
キャッシュ・ファンクションを使用すると、シングルトン・パイプの操作が簡略化されます。空のパイプからメッセージを受信する場合、失敗ケースを処理する必要はありません。また、キャッシュ関数は、シングルトンパイプからメッセージを読み取る際にキャッシュミスがないことを保証し、キャッシュされたメッセージを最大限に利用します。
キャッシュ・ファンクションを定義する場合は、ファンクション名が所有者スキーマで完全修飾されている必要があります:
OWNER.FUNCTION_NAME
OWNER.PACKAGE.FUNCTION_NAME
次のシグネチャを使用してキャッシュ関数を定義します。
CREATE OR REPLACE FUNCTION cache_function_name(
pipename IN VARCHAR2
) RETURN INTEGER;
キャッシュ・ファンクションの一般的な操作は次のとおりです。
DBMS_PIPE.CREATE_PIPE
を使用して、明示パイプ用のシングルトン・パイプを作成します。- シングルトンパイプにキャッシュするメッセージを作成します。
- キャッシュ関数で指定されたパイプにメッセージを送信し、オプションで暗黙的メッセージに
shelflife
を指定します。
キャッシュ・ファンクションを使用するには、DBMS_PIPE.RECEIVE_MESSAGE
を起動する現在のセッション・ユーザーに、キャッシュ・ファンクションの実行に必要な権限が必要です。
キャッシュ・ファンクションの定義の詳細は、RECEIVE_MESSAGEファンクションを参照してください。
親トピック: シングルトン・パイプを使用したメッセージのキャッシュ
明示的なシングルトンパイプを作成する
指定されたパイプ名(明示的なシングルトンパイプ)を持つシングルトンパイプを作成する手順について説明します。
まず、この例では、DBMS_PIPE.RECEIVE_MESSAGE
を繰り返しコールするreceive_message
ヘルパー関数を作成します。これにより、シングルトンパイプ機能をテストできます。
CREATE OR REPLACE FUNCTION msg_types AS
TYPE t_rcv_row IS RECORD (c1 VARCHAR2(32767), c2 NUMBER);
TYPE t_rcv_tab IS TABLE OF t_rcv_row;
END;
CREATE OR REPLACE FUNCTION receive_message(
pipename IN VARCHAR2,
rcv_count IN NUMBER DEFAULT 1,
cache_func IN VARCHAR2 DEFAULT NULL)
RETURN msg_types.t_rcv_tab pipelined
AS
l_msg VARCHAR2(32767);
l_status NUMBER;
BEGIN
FOR i IN 1..rcv_count LOOP
l_status := DBMS_PIPE.RECEIVE_MESSAGE(
pipename => pipename,
cache_func => cache_func,
timeout => 1);
IF l_status != 0 THEN
raise_application_error(-20000,
'Message not received for attempt: ' || to_char(i) || ' status: ' ||
l_status);
END IF;
DBMS_PIPE.UNPACK_MESSAGE(l_msg);
pipe row(msg_types.t_rcv_row(l_msg));
END LOOP;
RETURN;
END;
親トピック: シングルトン・パイプを使用したメッセージのキャッシュ
キャッシュ関数を使用した明示的なシングルトンパイプの作成
指定されたパイプ名、明示的なシングルトンパイプを使用してシングルトンパイプを作成する手順と、キャッシュ機能を提供する手順について説明します。キャッシュ関数を使用すると、メッセージをシングルトンパイプに自動的に移入できます。
親トピック: シングルトン・パイプを使用したメッセージのキャッシュ