ヘッダーをスキップ
Oracle Fusion Middleware Oracle TopLink開発者ガイド
11gリリース1(11.1.1)
B56246-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

92 Virtual Private Database用の排他独立クライアント・セッションの構成

この章では、サーバー・セッションから排他独立クライアント・セッションを取得する前に構成する必要のある様々なコンポーネントについて説明します。

この章の内容は次のとおりです。

表92-1は、独立セッションの構成可能オプションを示します。

92.1 排他独立クライアント・セッション構成の概要

表92-1は、独立セッションの構成可能オプションを示します。

表92-1 独立クライアント・セッションの構成可能オプション

構成オプション Oracle JDeveloper
TopLink Workbench
Java

ディスクリプタ・レベルでのキャッシュ分離(119.13項「ディスクリプタ・レベルでのキャッシュ分離機能の構成」を参照)

サポートされていない
サポートされていない
サポートされている

接続ポリシー(89.12項「接続ポリシーの構成」を参照)

サポートされていない
サポートされていない
サポートされている

Javaを使用したOracleデータベースのプロキシ認証(98.8.1項「Javaを使用したOracleデータベースのプロキシ認証の構成方法」を参照)

サポートされていない
サポートされていない
サポートされている

PostAcquireExclusiveConnectionイベント・ハンドラ(92.2項「PostAcquireExclusiveConnectionイベント・ハンドラの使用」を参照)

サポートされていない
サポートされていない
サポートされている

PreReleaseExclusiveConnectionイベント・ハンドラ(92.3項「PreReleaseExclusiveConnectionイベント・ハンドラの使用」を参照)

サポートされていない
サポートされていない
サポートされている

NoRowsModifiedSessionEventイベント・ハンドラ(92.4項「NoRowsModifiedSessionEventイベント・ハンドラの使用」を参照)

サポートされていない
サポートされていない
サポートされている

ValidationExceptionハンドラ(92.5項「アクセス・インダイレクション」を参照)

サポートされていない
サポートされていない
サポートされている

これらのオプションは独立セッションのライフ・サイクル全体を通じて使用されます(87.5.1.3項「独立クライアント・セッションのライフ・サイクル」を参照)。

92.2 PostAcquireExclusiveConnectionイベント・ハンドラの使用

TopLinkでは、排他接続が独立セッションに割り当てられた後に、ユーザーがその排他接続を使用してデータベースにログインすると、このイベントが発生します。

Oracleデータベースのプロキシ認証を使用している場合は(96.1.4.2項「Oracleデータベースのプロキシ認証」を参照)、このセッション・イベント・ハンドラを実装する必要はありません。

Oracleデータベースのプロキシ認証を使用していない場合は、独立セッションのライフ・サイクルの一環としてSessionEvent.PostAcquireExclusiveConnection用にSessionEventListenerを実装する必要があります。


注意:

このセッション・イベント・リスナーを、独立クライアント・セッションを取得するサーバー・セッションに追加する必要があります。独立クライアント・セッション自体には追加できません。詳細は、89.10項「セッション・イベント・リスナーの構成」を参照してください。

92.2.1 Javaの使用方法

SessionEvent.PostAcquireExclusiveConnectionイベント・リスナーを使用すると、ユーザーの認証が必要なケースや、基盤のデータベース・プラットフォームと対話する機会(PL/SQLを実行してVPDパッケージを作成し、VPDコンテキスト情報を設定するなど)を捕捉できます。

例92-1は、独立セッションのpostAcquireExclusiveConnectionイベントの処理に使用する一般的なセッション・イベント・リスナーを示します。

例92-1 独立セッションのセッション・イベント・リスナー

class VPDEventListener extends SessionEventAdaptor{
    public void postAcquireExclusiveConnection(SessionEvent event){
        ClientSession session = (ClientSession)event.getSession();
        // Get property set on the ConnectionPolicy prior to acquiring the connection
        String userLevel = session.getConnectionPolicy().getProperty("userLevel");
        // Make the Stored Procedure call for VPD to set up the Context Information
        session.executeNonSelectingSQL("StoreProcSetContextUser("+ userLevel + ")");
    }
}

必要なユーザー資格証明を取得するには、ClientSessionメソッドgetConnectionPolicyを使用して該当のConnectionPolicyを取得し、次に、ConnectionPolicyメソッドgetPropertyを使用します。ClientSessionConnectionPolicyには、必要なユーザー資格証明がすべて含まれています(89.12項「接続ポリシーの構成」を参照)。

必要なSessionEventListenerを実装した後、独立クライアント・セッションの取得元となる親サーバー・セッションに追加します。詳細は、89.10項「セッション・イベント・リスナーの構成」を参照してください。

92.3 PreReleaseExclusiveConnectionイベント・ハンドラの使用

独立セッション・メソッドreleaseがコールされると、TopLinkでSessionEvent.PreReleaseExclusiveConnectionイベントが発生します。

Oracleデータベースのプロキシ認証を使用している場合は(96.1.4.2項「Oracleデータベースのプロキシ認証」を参照)、このセッション・イベント・ハンドラを実装する必要はありません。

Oracleデータベースのプロキシ認証を使用していない場合は、独立セッションのライフ・サイクルの一環としてSessionEvent.PreReleaseExclusiveConnection用にSessionEventListenerを実装する必要があります。


注意:

このセッション・イベント・リスナーを、独立クライアント・セッションを取得するサーバー・セッションに追加する必要があります。独立クライアント・セッション自体には追加できません。詳細は、89.10項「セッション・イベント・リスナーの構成」を参照してください。

92.3.1 Javaの使用方法

SessionEvent.PreReleaseExclusiveConnectionイベント・リスナーにより、基盤のデータベース・プラットフォームと対話する機会(たとえば、PL/SQLを実行してVPDのパッケージやコンテキスト情報を削除するなど、VPD固有のクリーンアップを実行すること)が得られます。

例92-1は、独立セッションのpreReleaseExclusiveConnectionイベントの処理に使用する一般的なセッション・イベント・リスナーを示します。

例92-2 独立セッションのセッション・イベント・リスナー

class VPDEventListener extends SessionEventAdaptor{
    public void preReleaseExclusiveConnection(SessionEvent event){
        Session session event.getSession();
        // Make the Stored Procedure call for VPD to reset the Context Information
        session.executeNonSelectingSQL("StoreProcResetContext()");
    }
}

必要なユーザー資格証明を取得するには、ClientSessionメソッドgetConnectionPolicyを使用して該当のConnectionPolicyを取得し、次に、ConnectionPolicyメソッドgetPropertyを使用します。ClientSessionConnectionPolicyには、必要なユーザー資格証明がすべて含まれています(89.12項「接続ポリシーの構成」を参照)。

必要なSessionEventListenerを実装し、次に、それを親サーバー・セッションに追加し、この親サーバー・セッションから独立クライアント・セッションを取得します。詳細は、89.10項「セッション・イベント・リスナーの構成」を参照してください。

92.4 NoRowsModifiedSessionEventイベント・ハンドラの使用

一般的なエラー処理方法の一環として、SessionEvent.NoRowsModifiedSessionEvent用にSessionEventListenerを実装する必要があります。

TopLinkでこのイベントが発生するのは、データベースに対して更新または削除の問合せが実行されたが行が更新されない、つまり行数0(ゼロ)が返されたときです。

オプティミスティック・ロックが無効な場合にデータベースに問合せを行い、VPDセキュリティ構成に違反したときは、例外はスローされません。問合せでは単に0(ゼロ)行の更新が返されます。

オプティミスティック・ロックが有効な場合にデータベースに問合せを行い、VPDセキュリティ構成に違反したときは、障害の根本原因がオプティミスティック・ロック上の問題でなくセキュリティ違反であっても、OptimisticLockExceptionがスローされます。


注意:

このセッション・イベント・リスナーを、独立クライアント・セッションを取得するサーバー・セッションに追加する必要があります。独立クライアント・セッション自体には追加できません。詳細は、89.10項「セッション・イベント・リスナーの構成」を参照してください。

92.4.1 Javaの使用方法

このイベント・リスナーを使用することにより、更新の失敗がセキュリティ違反によるものか(この場合は操作を再実行しないでください)、オプティミスティック・ロック問題(この場合は再試行が適切なことがあります)によるものかが判明します。

関連するオブジェクトがある場合にそれを取得するには、既存のセッション・イベントAPI(getQuery().getResult()など)を使用します。

必要なSessionEventListenerを実装し、次に、それを親サーバー・セッションに追加し、この親サーバー・セッションから独立クライアント・セッションを取得します。詳細は、89.10項「セッション・イベント・リスナーの構成」を参照してください。

92.5 アクセス・インダイレクション

一般的なエラー処理方法の一環として、タイプISOLATED_SESSION_IS_NO_LONGER_AVAILABLEValidationExceptionを処理できるようにアプリケーションを準備してください。

クライアントが独立オブジェクトに対してインダイレクション(遅延ロード)をトリガーしたときに、オブジェクトのロードに使用された独立セッションが使用できなくなると、つまり、独立セッション・メソッドreleaseをコールすると、TopLinkによりISOLATED_SESSION_IS_NO_LONGER_AVAILABLEがスローされます。


注意:

releaseメソッドをコールする前に、必要なすべてのリレーションシップをインスタンス化しておく必要があります。すなわち、1対1リレーションシップをインスタンス化するにはgetメソッドを、1対多リレーションシップをインスタンス化するにはsizeメソッドをコレクションでコールします。

詳細は、次を参照してください。