この章では、サーバー・セッションから排他独立クライアント・セッションを取得する前に構成する必要のある様々なコンポーネントについて説明します。
この章の内容は次のとおりです。
表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項「独立クライアント・セッションのライフ・サイクル」を参照)。
TopLinkでは、排他接続が独立セッションに割り当てられた後に、ユーザーがその排他接続を使用してデータベースにログインすると、このイベントが発生します。
Oracleデータベースのプロキシ認証を使用している場合は(96.1.4.2項「Oracleデータベースのプロキシ認証」を参照)、このセッション・イベント・ハンドラを実装する必要はありません。
Oracleデータベースのプロキシ認証を使用していない場合は、独立セッションのライフ・サイクルの一環としてSessionEvent.PostAcquireExclusiveConnection
用にSessionEventListener
を実装する必要があります。
注意: このセッション・イベント・リスナーを、独立クライアント・セッションを取得するサーバー・セッションに追加する必要があります。独立クライアント・セッション自体には追加できません。詳細は、89.10項「セッション・イベント・リスナーの構成」を参照してください。 |
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
を使用します。ClientSession
のConnectionPolicy
には、必要なユーザー資格証明がすべて含まれています(89.12項「接続ポリシーの構成」を参照)。
必要なSessionEventListener
を実装した後、独立クライアント・セッションの取得元となる親サーバー・セッションに追加します。詳細は、89.10項「セッション・イベント・リスナーの構成」を参照してください。
独立セッション・メソッドrelease
がコールされると、TopLinkでSessionEvent.PreReleaseExclusiveConnection
イベントが発生します。
Oracleデータベースのプロキシ認証を使用している場合は(96.1.4.2項「Oracleデータベースのプロキシ認証」を参照)、このセッション・イベント・ハンドラを実装する必要はありません。
Oracleデータベースのプロキシ認証を使用していない場合は、独立セッションのライフ・サイクルの一環としてSessionEvent.PreReleaseExclusiveConnection
用にSessionEventListener
を実装する必要があります。
注意: このセッション・イベント・リスナーを、独立クライアント・セッションを取得するサーバー・セッションに追加する必要があります。独立クライアント・セッション自体には追加できません。詳細は、89.10項「セッション・イベント・リスナーの構成」を参照してください。 |
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
を使用します。ClientSession
のConnectionPolicy
には、必要なユーザー資格証明がすべて含まれています(89.12項「接続ポリシーの構成」を参照)。
必要なSessionEventListener
を実装し、次に、それを親サーバー・セッションに追加し、この親サーバー・セッションから独立クライアント・セッションを取得します。詳細は、89.10項「セッション・イベント・リスナーの構成」を参照してください。
一般的なエラー処理方法の一環として、SessionEvent.NoRowsModifiedSessionEvent
用にSessionEventListener
を実装する必要があります。
TopLinkでこのイベントが発生するのは、データベースに対して更新または削除の問合せが実行されたが行が更新されない、つまり行数0(ゼロ)が返されたときです。
オプティミスティック・ロックが無効な場合にデータベースに問合せを行い、VPDセキュリティ構成に違反したときは、例外はスローされません。問合せでは単に0(ゼロ)行の更新が返されます。
オプティミスティック・ロックが有効な場合にデータベースに問合せを行い、VPDセキュリティ構成に違反したときは、障害の根本原因がオプティミスティック・ロック上の問題でなくセキュリティ違反であっても、OptimisticLockException
がスローされます。
注意: このセッション・イベント・リスナーを、独立クライアント・セッションを取得するサーバー・セッションに追加する必要があります。独立クライアント・セッション自体には追加できません。詳細は、89.10項「セッション・イベント・リスナーの構成」を参照してください。 |
このイベント・リスナーを使用することにより、更新の失敗がセキュリティ違反によるものか(この場合は操作を再実行しないでください)、オプティミスティック・ロック問題(この場合は再試行が適切なことがあります)によるものかが判明します。
関連するオブジェクトがある場合にそれを取得するには、既存のセッション・イベントAPI(getQuery().getResult()
など)を使用します。
必要なSessionEventListener
を実装し、次に、それを親サーバー・セッションに追加し、この親サーバー・セッションから独立クライアント・セッションを取得します。詳細は、89.10項「セッション・イベント・リスナーの構成」を参照してください。
一般的なエラー処理方法の一環として、タイプISOLATED_SESSION_IS_NO_LONGER_AVAILABLE
のValidationException
を処理できるようにアプリケーションを準備してください。
クライアントが独立オブジェクトに対してインダイレクション(遅延ロード)をトリガーしたときに、オブジェクトのロードに使用された独立セッションが使用できなくなると、つまり、独立セッション・メソッドrelease
をコールすると、TopLinkによりISOLATED_SESSION_IS_NO_LONGER_AVAILABLE
がスローされます。
注意: release メソッドをコールする前に、必要なすべてのリレーションシップをインスタンス化しておく必要があります。すなわち、1対1リレーションシップをインスタンス化するにはget メソッドを、1対多リレーションシップをインスタンス化するにはsize メソッドをコレクションでコールします。 |
詳細は、次を参照してください。