シングルトン・パイプでメッセージをキャッシュ
シングルトン・パイプはDBMS_PIPE
パッケージに追加され、カスタム・メッセージをキャッシュして取得し、複数のデータベース・セッション間でメッセージを同時読取りと共有できます。
- シングルトン・パイプを使用したメッセージのキャッシングについて
DBMS_PIPE
パッケージには、シングルトン・パイプをサポートする拡張機能がAutonomous Databaseにあります。 - キャッシュ関数を使用したキャッシュ・メッセージの自動リフレッシュ
DBMS_PIPE
パッケージでは、ユーザー定義のキャッシュ関数を使用してシングルトン・パイプ・メッセージを自動的に移入できます。 - 明示的なシングルトン・パイプの作成
指定されたパイプ名(明示的なシングルトン・パイプ)でシングルトン・パイプを作成するステップについて説明します。 - キャッシュ関数を使用した明示的なシングルトン・パイプの作成
指定されたパイプ名、明示的なシングルトン・パイプ、およびキャッシュ機能を提供するシングルトン・パイプを作成するステップについて説明します。 キャッシュ関数を使用すると、メッセージをシングルトン・パイプに自動的に移入できます。
シングルトン・パイプを使用したメッセージのキャッシングについて
DBMS_PIPE
パッケージには、シングルトン・パイプをサポートする拡張機能がAutonomous Databaseにあります。
DBMS_PIPE
のシングルトン・パイプ:
-
シングルトン・パイプ・メッセージを使用して、カスタム・データのインメモリー・キャッシュを提供します。
-
最大32,767バイトのカスタム・メッセージをキャッシュおよび取得する機能をサポートします。
-
複数のデータベース・セッション間でキャッシュされたメッセージを同時読取りと共有できます。 これにより、高いスループットが提供され、データベース・セッション間のメッセージの同時読取りがサポートされます。
-
読取り専用および読取り/書込みデータベースをサポートします。
-
いくつかのキャッシュ無効化メソッドがサポートされています:
- ユーザーが制御する明示的なキャッシュ無効化。
- ユーザーが指定した時間間隔(秒)後にキャッシュ無効化。 この無効化メソッドは、メッセージ・リーダーではなく
shelflife
パラメータを使用して、メッセージ送信者によって制御されます。 これにより、リーダーによるキャッシュの不正使用による一般的な落とし穴を回避できます。
標準パイプおよびシングルトン・パイプについて
DBMS_PIPEパッケージを使用すると、2つ以上のデータベース・セッションがインメモリー・メッセージを使用して通信できます。 パイプ機能には、外部サービス・インタフェース、デバッグ、独立したトランザクション、アラートなどの複数のアプリケーションがあります。

図database-pipe-messages-singleton-pipes.epsの説明
シングルトン・パイプは、サポートされているDBMS_PIPE
タイプのいずれかです:
- 暗黙的なパイプ:
DBMS_PIPE.SEND_MESSAGE
関数を使用して不明なパイプ名でメッセージを送信すると、自動的に作成されます。 - 明示的なパイプ: ユーザーが指定したパイプ名で
DBMS_PIPE.CREATE_PIPE
関数を使用して作成されます。 - パブリック・パイプ:
DBMS_PIPE
パッケージに対するEXECUTE
権限を持つすべてのユーザーがアクセスできます。 - プライベート・パイプ: パイプ作成者と同じユーザーを持つセッションからアクセスできます。
シングルトン・パイプを使用すると、単一のメッセージをAutonomous Databaseインスタンスのメモリーにキャッシュできます。
次に、シングルトン・パイプを使用するための一般的なワークフローを示します。

図singleton-pipe-workflow.epsの説明
シングルトン・パイプの概要と機能
-
シングルトン・メッセージ
- シングルトン・パイプは1つのメッセージをパイプにキャッシュできるため、「singleton」という名前になります。
- シングルトン・パイプのメッセージは複数のフィールドで構成でき、合計メッセージ・サイズは32,767バイトまでです。
DBMS_PIPE
は、DBMS_PIPE.PACK_MESSAGE
プロシージャを使用してメッセージ内の複数の属性をパックする機能をサポートしています。- パブリック・シングルトン・パイプの場合、
DBMS_PIPE
パッケージに対する実行権限を持つ任意のデータベース・セッションでメッセージを受信できます。 - プライベート・シングルトン・パイプでは、シングルトン・パイプの作成者と同じユーザーを持つセッションでメッセージを受信できます。
- 読取りのための高いメッセージ・スループット
- Singleton Pipesは、無効化またはパージされるまでメッセージをパイプにキャッシュします。 データベース・セッションは、シングルトン・パイプからメッセージを同時に読み取ることができます。
- シングルトン・パイプからメッセージを受信することは、非ブロッキング操作です。
- メッセージ・キャッシング
- メッセージは、
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
時間が経過すると、データベースはシングルトン・パイプに新しいメッセージを自動的に移入します。
キャッシュ機能を使用すると、シングルトン・パイプの操作が簡単になります。 空のパイプからメッセージを受信する障害ケースを処理する必要はありません。 また、キャッシュ機能により、シングルトン・パイプからメッセージを読み取る際にキャッシュ・ミスがなくなり、キャッシュされたメッセージを最大限に利用できます。

図automatic-cache-refresh-cache-function.epsの説明
キャッシュ関数を定義する場合、関数名は所有者スキーマで完全修飾されている必要があります:
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ファンクション」を参照してください。
親トピック: シングルトン・パイプでメッセージをキャッシュ
明示的なシングルトン・パイプの作成
指定されたパイプ名(明示的なシングルトン・パイプ)でシングルトン・パイプを作成するステップについて説明します。
最初に、この例では、receive_message
ヘルパー関数を作成して、DBMS_PIPE.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;
親トピック: シングルトン・パイプでメッセージをキャッシュ
キャッシュ関数を使用した明示的なシングルトン・パイプの作成
指定されたパイプ名、明示的なシングルトン・パイプを使用してシングルトン・パイプを作成し、キャッシュ機能を提供するステップについて説明します。 キャッシュ関数を使用すると、メッセージをシングルトン・パイプに自動的に移入できます。
親トピック: シングルトン・パイプでメッセージをキャッシュ