ヘッダーをスキップ
Oracle TopLink開発者ガイド
10g(10.1.3.1.0)
B31861-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

83 データベース・ログインの構成

リレーショナル・データベース・プロジェクトでは、TopLinkにより、ディスクリプタごとにデータベースから表情報が取得されます。各TopLink Workbenchプロジェクトには、関連するデータベースが含まれます。各データベースには、複数のログインを作成できます。

表83-1に、データベース・ログインに対して構成可能なオプションを示します。

データベース・ログイン構成の概要

表83-1に、データベース・ログインに対して構成可能なオプションを示します。

セッション・レベルでのリレーショナル・データベース・プラットフォームの構成

各データベース・セッションには、データベース・プラットフォーム(Oracle9i Database Serverなど)を指定する必要があります。このプラットフォーム構成により、プロジェクト・レベルでプラットフォームがオーバーライドされます(構成されている場合)。

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

TopLink Workbenchの使用

リレーショナル・サーバー(またはデータベース)のセッション・ログインにデータベース・プラットフォームのオプションを指定するには、次の手順を実行します。

  1. ナビゲータでリレーショナル・サーバー(またはデータベース)セッションを選択します。そのプロパティがエディタに表示されます。

  2. 「ログイン」タブをクリックします。「ログイン」タブが表示されます。

  3. 「接続」サブタブをクリックします。「接続」サブタブが表示されます。

  4. 図83-1 「ログイン」タブ、「接続」サブタブ、「データベース・プラットフォーム」オプション

    図83-1の説明が続きます
    「図83-1 「ログイン」タブ、「接続」サブタブ、「データベース・プラットフォーム」オプション」の説明

オプションのメニューからデータベース・プラットフォームを選択します。このメニューには、TopLinkクラスパスのDatabasePlatformのすべてのインスタンスが含まれます。

データベース・ログインの接続オプションの構成

CMP以外のTopLinkアプリケーションについては接続情報をセッション・レベルで構成します。この情報は、sessions.xmlファイルに格納されます。TopLinkランタイムでは、CMP以外のTopLinkアプリケーションのセッションを使用して永続性操作を実行する場合は常にこの情報が使用されます。

この接続構成により、プロジェクト・レベルで接続情報がオーバーライドされます(構成されている場合)。プロジェクト・レベルの構成の詳細は、「開発ログインおよびデプロイ・ログインの構成」を参照してください。

この接続構成は、接続プール・レベルの接続情報によってオーバーライドされます。詳細は、「接続プールの接続オプションの構成」を参照してください。

TopLink Workbenchの使用

リレーショナル・サーバー(またはデータベース)のセッション・ログインに接続オプションを指定するには、次の手順を実行します。

  1. ナビゲータでリレーショナル・サーバー(またはデータベース)セッションを選択します。そのプロパティがエディタに表示されます。

  2. 「ログイン」タブをクリックします。「ログイン」タブが表示されます。

  3. 「接続」サブタブをクリックします。「接続」サブタブが表示されます。

    図83-2 「ログイン」タブ、「接続」サブタブ、「データベース・ドライバ」

    図83-2の説明が続きます
    「図83-2 「ログイン」タブ、「接続」サブタブ、「データベース・ドライバ」」の説明

    図83-3 「ログイン」タブ、「接続」サブタブ

    図83-3の説明が続きます
    「図83-3 「ログイン」タブ、「接続」サブタブ」の説明

次の情報を参照し、タブの「ドライバ」フィールドにデータを入力します。

フィールド 説明
データベース・ドライバ 適切なデータベース・ドライバを指定します。
  • ドライバ・マネージャ: データベースに接続するためのドライバ・クラスおよびURLを構成する場合、このオプションを指定します。この場合、「ドライバ・クラス」および「ドライバURL」フィールドを構成する必要があります。

  • J2EEデータ・ソース: ターゲット・アプリケーション・サーバーにすでに構成されているJ2EEデータ・ソースを使用する場合、このオプションを指定します。この場合、「データ・ソース名」フィールドを構成する必要があります。

注意: 「J2EEデータ・ソース」を選択する場合、外部接続プールを使用する必要があります。この「データベース・ドライバ」オプションの場合、内部接続プールは使用できません(詳細は、「外部接続プーリングの構成」を参照してください)。

ドライバ・クラス脚注1 「データベース・ドライバ」「ドライバ・マネージャ」に設定されている場合はこのフィールドを構成します。オプションのメニューから選択します。このメニューには、TopLinkクラスパスのすべてのJDBCドライバが含まれます。
URL脚注1 「データベース・ドライバ」「ドライバ・マネージャ」に設定されている場合はこのフィールドを構成します。選択した「ドライバ・クラス」に関連するオプションのメニューから選択し、データ・ソースに合せてURLを編集します。
データ・ソース名脚注2 「データベース・ドライバ」「J2EEデータ・ソース」に設定されている場合はこのフィールドを構成します。ターゲット・アプリケーション・サーバーで事前に構成されているJ2EEデータ・ソースを示す有効なJNDI名を指定します(例: jdbc/EmployeeDB)。

慣例により、このような名前はすべて(提供されるすべてのリソース・ファクトリのルートである標準のjava:comp/envネーミング・コンテキストを基準として)JDBCサブコンテキストに変換する必要があります。

ルックアップ・タイプ脚注2 「データベース・ドライバ」「J2EEデータ・ソース」に設定されている場合はこのフィールドを構成します。JNDI名を決定するためのルックアップ方法を指定します。
  • コンポジット名

  • 複合名

  • 文字列


脚注1 「データベース・ドライバ」「ドライバ・マネージャ」に設定されている場合のみ適用されます。

脚注2 「データベース・ドライバ」「J2EEデータ・ソース」に設定されている場合のみ適用されます。

セッション・レベルでの順序付けの構成

TopLinkの順序付けをセッションまたはプロジェクト・レベルで構成することにより、順序値(使用する順序のタイプ)を取得する方法をTopLinkに指示します。

CMPプロジェクトの場合、セッションは直接構成しません。この場合、順序をプロジェクト・レベルで構成する必要があります(「プロジェクト・レベルでの順序付けの構成」を参照)。CMP以外のプロジェクトの場合、セッションは直接構成できます。この場合、必要に応じて、セッション・レベルの順序構成を使用して、セッション別のプロジェクト・レベルの順序構成をオーバーライドできます。

TopLink Workbench(「TopLink Workbenchの使用」を参照)を使用する場合、表の順序付け(「表の順序付け」を参照)およびネイティブ順序付け(「Oracleデータベース・プラットフォームによるネイティブ順序付け」および「Oracle以外のデータベース・プラットフォームによるネイティブ順序付け」を参照)を構成することや、すべての順序に適用される事前割当てサイズを構成することが可能です(「順序付けと事前割当てサイズ」を参照)。

Javaを使用する場合(「Javaの使用」を参照)、TopLinkがサポートしている任意の順序タイプを構成できます(「順序付けタイプ」を参照)。順序を任意の数および組合せで作成できます。順序オブジェクトを明示的に作成することや、プラットフォームが作成するデフォルトの順序を使用することが可能です。同じ順序を複数のディスクリプタに関連付け、ディスクリプタの順序ごとに個別の事前割当てサイズを構成できます。

BEA WebLogic CMPアプリケーションからOC4JおよびTopLinkの永続性に移行する場合(「BEA WebLogic永続性のOC4J TopLink永続性への移行」を参照)、TopLink移行ツールを使用しても、BEA WebLogicの単一列順序表はTopLinkの単一列順序表に移行されません(「単一列表の順序付け」を参照)。当初、アプリケーションがBEA WebLogicの単一列順序表を使用していた場合は、移行後はTopLinkの単一列順序表を使用するようにプロジェクトを手動で構成する必要があります。

セッション(またはプロジェクト)・レベルで順序タイプを構成した後、順序付けを有効にするには、順序フィールドおよび順序名を使用してディスクリプタを構成する必要があります(「ディスクリプタ・レベルでの順序付けの構成」を参照)。

順序付けの詳細は、「リレーショナル・プロジェクトにおける順序付けの概要」を参照してください。

TopLink Workbenchの使用

リレーショナル・サーバー(またはデータベース)・セッションに順序付け情報を指定するには、次の手順を実行します。

  1. 「ナビゲータ」でセッション・オブジェクトを選択します。

  2. 「エディタ」「ログイン」タブを選択します。

  3. 「順序付け」サブタブをクリックします。「順序付け」サブタブが表示されます。

    図83-4 「ログイン」タブ、「順序付け」サブタブ

    図83-4の説明が続きます
    「図83-4 「ログイン」タブ、「順序付け」サブタブ」の説明

次の情報を参照し、「順序付け」サブタブの各フィールドにデータを入力して永続性タイプを構成します。

フィールド 説明
事前割当てサイズ デフォルトの事前割当てサイズを選択します(「順序付けと事前割当てサイズ」を参照)。デフォルトは50です。構成する事前割当てサイズはすべての順序に適用されます。
デフォルトの順序表 デフォルトの順序表名SEQUENCE、デフォルトの順序名フィールドSEQ_NAME、およびデフォルトの順序数フィールドSEQ_COUNTを使用して表の順序付けを使用する場合、このオプションを選択します(「表の順序付け」を参照)。
ネイティブ順序付け データベース・プラットフォームによって作成される順序付けオブジェクトを使用する場合、このオプションを選択します(「Oracleデータベース・プラットフォームによるネイティブ順序付け」または「Oracle以外のデータベース・プラットフォームによるネイティブ順序付け」を参照)。このオプションは、Oracle、Sybase、Microsoft SQL、IBM InformixおよびIBM DB2データベース・プラットフォームに対してのみ適用されます。
カスタム順序表 指定する順序表名、順序名フィールドおよび順序数フィールド名を使用して表の順序付けを使用する場合、このオプションを選択します(「表の順序付け」を参照)。
    名前 順序表の名前を選択します。
    名前フィールド 順序名を格納するために使用する列の名前を選択します。
    カウンタ・フィールド 順序数を格納するために使用する列の名前を選択します。

Javaの使用

Javaを使用する場合、次の順序構成を実行できます。

プラットフォームのデフォルトの順序の使用

プラットフォームを使用してログインを構成した後(「セッション・レベルでのリレーショナル・データベース・プラットフォームの構成」を参照)、プラットフォームが提供するデフォルトの順序を使用できます。

指定されていない順序にディスクリプタを関連付けると、TopLinkランタイムはDefaultSequenceのインスタンスを作成し、このディスクリプタの順序付けを提供します。詳細は、「プラットフォームのデフォルト順序の構成」を参照してください。

例83-1に示すように、デフォルトのプラットフォームの順序には直接アクセスできます。たとえば、デフォルトでは、DatabasePlatformにより、デフォルトの表および列名を使用して表の順序が作成されます(「表の順序付け」を参照)。

例83-1 プラットフォームのデフォルトの順序へのアクセス

// assume that dbLogin owns a DatabasePlatform
TableSequence tableSeq2 = ((TableSequence)dbLogin.getDefaultSequence()).clone();
tableSeq2.setName("EMP_SEQ");
tableSeq2.setPreallocationSize(75);
dbLogin.addSequence(tableSeq2);

プラットフォームのデフォルトの順序のクローニングを回避するには、例83-2に示すように、DefaultSequenceクラス(プラットフォームのデフォルトの順序のラッパー)を使用します。EMP_SEQという名前の新規順序がプラットフォームのデフォルトの順序と同じタイプになります。

例83-2 DefaultSequenceクラスの使用

login.addSequence(
    new DefaultSequence("EMP_SEQ", 75)
);

例83-3に示すように、デフォルトのプラットフォームの順序をオーバーライドできます。この例では、dbLoginは、タイプTableSequenceのデフォルトの順序を提供するDatabasePlatformを所有しています。デフォルトの順序をタイプUnaryTableSequenceに設定した後、DefaultSequenceクラスを使用すると、新しいデフォルトの順序タイプにアクセスします。この例では、EMP_SEQという名前の順序がタイプUnaryTableSequenceになり、事前割当てサイズは75になります。

例83-3 プラットフォームのデフォルトの順序のオーバーライド

// assume that dbLogin owns a DatabasePlatform
Sequence unaryTableSequence = new UnaryTableSequence();
unaryTableSequence.setPreallocationSize(40);
dbLogin.setDefaultSequence(unaryTableSequence);
dbLogin.addSequence(
    new DefaultSequence("EMP_SEQ", 75) // UnaryTableSequence
);

複数の順序の構成

プラットフォームのデフォルトの順序を使用する以外にも(「プラットフォームのデフォルトの順序の使用」を参照)、例83-4に示すように、順序インスタンスを明示的に作成し、それぞれが独自の事前割当てサイズを持つ順序タイプの組合せを使用してLoginを構成できます。この例では、EMP_SEQという名前の順序はEmployeeクラスのインスタンスに対してのみ順序値を提供し、ADD_SEQAddressクラスのインスタンスに対してのみ順序値を提供します。PHONE_SEQという名前の順序は、事前割当てサイズが30のプラットフォームのデフォルトの順序を使用し、Phoneクラスの順序値を提供します。

例83-4 複数の順序の明示的構成

login.addSequence(new TableSequence("EMP_SEQ", 25));
login.addSequence(new DefaultSequence("PHONE_SEQ", 30));
login.addSequence(new UnaryTableSequence("ADD_SEQ", 55));
login.addSequence(new NativeSequence("NAT_SEQ", 10));

ログインがDatabasePlatform(デフォルトの順序タイプはTableSequence)を所有している場合、例83-5に示すように、プラットフォームのデフォルトの順序タイプを使用して順序を構成できます。この例では、順序EMP_SEQおよびPHONE_SEQは同じTableSequence表を共有しています。EMP_SEQおよびPHONE_SEQは、この表の行を示します。

例83-5 デフォルトの順序タイプを使用した複数の順序の構成

login.addSequence(new DefaultSequence("EMP_SEQ", 25));
login.addSequence(new DefaultSequence("PHONE_SEQ", 30));
login.addSequence(new UnaryTableSequence("ADD_SEQ", 55));
login.addSequence(new NativeSequence("NAT_SEQ", 10));

問合せの順序付けの構成

QuerySequenceを拡張する任意の順序タイプについて、順序値の更新または読取りに、TopLinkが使用する問合せを構成できます。

ほとんどのアプリケーションでは、TopLinkが自動的に使用する問合せで十分です。ただし、順序付け用としてストアド・プロシージャを使用する場合など、アプリケーションに特別な順序付けが必要な場合、TopLinkの順序で使用する更新および読取り問合せを構成できます。

次に、1回のSQLの選択問合せで順序を更新し、新規順序値を返すストアド・プロシージャを指定する方法を示します。この例では、ストアド・プロシージャにはUPDATE_SEQという名前が付いています。これには、1つの入力引数(更新対象の順序名であるSEQ_NAME)および1つの出力引数(更新後の順序値であるSEQ_COUNT)が含まれています。このストアド・プロシージャは、SEQ_NAMEという名前の順序に関連付けられている順序値を増やし、SEQ_COUNTという名前の出力引数で新規順序値を返します。

例83-6 順序の更新と選択の両方を実行するためのストアド・プロシージャの使用

ValueReadQuery seqReadQuery = new ValueReadQuery();
StoredProcedureCall spCall = new StoredProcedureCall();
spCall.setProcedureName("UPDATE_SEQ");
seqReadQuery.addNamedArgument("SEQ_NAME");
seqReadQuery.addNamedOutputArgument("SEQ_COUNT");
seqReadQuery.setCall(spCall);
((QuerySequence)login.getDefaultSequence()).setSelectQuery(seqReadQuery);

また、順序の更新アクションと選択アクション用としてストアド・プロシージャを個別に指定する方法を示します。

例83-7では、ストアド・プロシージャの名前はUPDATE_SEQであり、更新する順序の名前(SEQ_NAME)が1つの引数として含まれます。ストアド・プロシージャは、SEQ_NAMEという名前の順序に関連付けられている順序値を増やします。

例83-7 順序更新のみのためのストアド・プロシージャの使用

DataModifyQuery seqUpdateQuery = new DataModifyQuery();
StoredProcedureCall spCall = new StoredProcedureCall();
spCall.setProcedureName("UPDATE_SEQ");
seqUpdateQuery.addNamedArgument("SEQ_NAME");
seqUpdateQuery.setCall(spCall);
((QuerySequence)login.getDefaultSequence()).setUpdateQuery(seqUpdateQuery);

例83-8では、ストアド・プロシージャの名前はSELECT_SEQであり、選択する順序の名前(SEQ_NAME)を1つの引数としてとります。ストアド・プロシージャは、1つのデータ値(順序名SEQ_NAMEに関連付けられている現在の順序値)を読み取ります。

例83-8 順序選択のみのためのストアド・プロシージャの使用

ValueReadQuery seqReadQuery = new ValueReadQuery();
StoredProcedureCall spCall = new StoredProcedureCall();
spCall.setProcedureName("SELECT_SEQ");
seqReadQuery.addArgument("SEQ_NAME");
seqReadQuery.setCall(spCall);
login.((QuerySequence)getDefaultSequence()).setSelectQuery(seqReadQuery)

また、例83-9に示すように、QuerySequenceを直接作成し、ログインに追加することもできます。

例83-9 QuerySequenceクラスの使用

// Use the two-argument constructor: pass in sequence name and preallocation size.
// Alternatively, you can use zero- or one-argument (sequence name) constructor
login.addSequence(new QuerySequence("SEQ1", 75));

表修飾子の構成

一部のデータベース(Oracle DatabaseやDB2など)では、すべての表を識別子で修飾する必要があります。これには、表の作成者や表が存在するデータベース名などがあります。表修飾子を指定すると、TopLinkは、参照するすべての表に対してこの修飾子を使用します。表修飾子を指定するのは、表修飾子が必要で、すべての表の修飾子が同じである場合のみです。

TopLink Workbenchの使用

表修飾子を指定するには、次の手順を実行します。

「表修飾子」フィールドで、このデータベースのすべての表に対する参照を修飾するための識別子を入力します。

JDBCオプションの構成

ほとんどのJDBCドライバは、ユーザーのニーズに合せてドライバ操作をカスタマイズするための様々なオプションのランタイム構成をサポートしています。TopLinkは、多くの最も重要なオプションのみでなく、この項で説明するように、より詳細なオプション(「詳細オプションの構成」を参照)を(APIおよびTopLink Workbenchで)直接サポートしています。

また、プロパティを指定することにより、追加オプションを構成することもできます(「プロパティの構成」を参照)。


注意:

すべてのドライバがすべてのJDBCオプションをサポートするとはかぎりません。選択するオプションの組合せにより、ドライバの動作が異なる場合があります。JDBCオプションを選択する前に、使用するJDBCドライバのドキュメントを参照してください。

TopLink Workbenchの使用

リレーショナル・サーバー(またはデータベース)のセッション・ログインにJDBCオプションを指定するには、次の手順を実行します。

  1. ナビゲータでリレーショナル・サーバー(またはデータベース)セッションを選択します。そのプロパティがエディタに表示されます。

  2. 「ログイン」タブをクリックします。「ログイン」タブが表示されます。

  3. 「オプション」サブタブをクリックします。「オプション」サブタブが表示されます。

    図83-5 「ログイン」タブ、「オプション」サブタブ、「JDBCオプション」

    図83-5の説明が続きます
    「図83-5 「ログイン」タブ、「オプション」サブタブ、「JDBCオプション」」の説明

オプション 説明
問合せのすべてのパラメータをバインド脚注1 問合せのすべてのパラメータをバインドする場合、このオプションを選択します。
すべての文をキャッシュ脚注1 このオプションを選択すると、プリコンパイルされた各文がキャッシュされるため、再実行時にSQL文のプリコンパイル時間を短縮し、パフォーマンスを向上させることができます。
バイト配列バインディング脚注1 バイナリ・ラージ・オブジェクト(BLOB)データを問い合せる場合、このオプションを選択します。
バインド用ストリーム脚注1 java.io.InputStreamおよびjava.io.OutputStreamを使用したBLOBデータの処理時により効率的なJDBCドライバを使用する場合、このオプションを選択します。
ネイティブSQL デフォルトでは、TopLinkは、JDBC SQL文法を使用してSQLを生成します。データベース・ドライバが完全なJDBC SQL文法をサポートしていない場合など、TopLinkがデータベース固有のSQL文法を使用するようにする場合、このオプションを選択します。
バッチ書込み脚注2 INSERTUPDATEおよびDELETE文のグループを個別にではなく1つのトランザクションでデータベースに送信する操作をサポートしているJDBCドライバを使用する場合、このオプションを選択します。

JDBCドライバのバッチ書込み機能を使用する場合、「JDBC」を選択します。

TopLinkが提供するネイティブのバッチ書込み機能を使用する場合、「TopLink」を選択します。JDBCドライバがバッチ書込みをサポートしていない場合、このオプションを選択します。

文字列バインディング脚注1 大規模なjava.lang.Stringオブジェクトを問い合せる場合、このオプションを選択します。

Stringの最大長を構成できます(デフォルト: 32000文字)。


脚注1 詳細は、「パラメータ使用のSQL(バインド)とプリコンパイルされたSQL文のキャッシュ」を参照してください。

脚注2 MySQL4データベース・プラットフォーム(「データ・ソース・プラットフォームのタイプ」を参照)を使用する場合、JDBCバッチ書込みを使用してください(TopLinkバッチ書込みは使用しないでください)。詳細は、「バッチ書込み」を参照してください。

Javaの使用

すべての問合せに対してパラメータ使用のSQLとプリコンパイルされた文のキャッシュを有効にするには、例83-10に示すように、Loginレベルで構成します。詳細は、「パラメータ使用のSQL(バインド)とプリコンパイルされたSQL文のキャッシュ」を参照してください。

例83-10 ログイン・レベルでのパラメータ使用のSQLとバインド

databaseLogin.bindAllParameters();
databaseLogin.cacheAllStatements();
databaseLogin.setStatementCacheSize(100);

JDBCバッチ書込みを有効にするには、例83-11に示すように、LoginのメソッドuseBatchWritingを使用します。

例83-11 JDBCバッチ書込みの使用

project.getLogin().useBatchWriting();
project.getLogin().bindAllParameters();
project.getLogin().setMaxBatchWritingSize(100);

詳細オプションの構成

ほとんどのJDBCドライバは、ユーザーのニーズに合せてドライバ操作をカスタマイズするための様々なオプションのランタイム構成をサポートしています。TopLinkでは、多くの最も重要なオプション(「JDBCオプションの構成」を参照)のみでなく、この項で説明するように、より詳細なオプションも(APIおよびTopLink Workbenchで)直接サポートしています。

また、プロパティを指定することにより、追加オプションを構成することもできます(「プロパティの構成」を参照)。


注意:

すべてのドライバがすべてのJDBCオプションをサポートするとはかぎりません。選択するオプションの組合せにより、ドライバの動作が異なる場合があります。JDBCオプションを選択する前に、使用するJDBCドライバのドキュメントを参照してください。

TopLink Workbenchの使用

リレーショナル・サーバー(またはデータベース)のセッション・ログインに詳細オプションを指定するには、次の手順を実行します。

  1. ナビゲータでリレーショナル・サーバー(またはデータベース)セッションを選択します。そのプロパティがエディタに表示されます。

  2. 「ログイン」タブをクリックします。「ログイン」タブが表示されます。

  3. 「オプション」サブタブをクリックします。「オプション」サブタブが表示されます。

    図83-6 「ログイン」タブ、「オプション」サブタブ、「詳細オプション」

    図83-6の説明が続きます
    「図83-6 「ログイン」タブ、「オプション」サブタブ、「詳細オプション」」の説明

オプション 説明
フィールド名を大文字に変換 デフォルトでは、TopLinkは、データベースから返されたフィールド名に応じて大文字または小文字を使用します。フィールド名が大文字であることをアプリケーションが予期しているが、データベースが大文字を返さない場合(異なるデータベースにアクセスしている場合など)は、このオプションを有効にします。
データ変換の最適化 デフォルトでは、TopLinkは、アプリケーションが必要とする形式でJDBCからデータにアクセスして、データ・アクセスを最適化します。データ変換が行われなくなった古いJDBCドライバを使用しているために、この最適化と競合する場合は、この最適化を無効にします。
文字列のトリミング デフォルトでは、TopLinkは、CHARフィールド値から後続の空白を削除します。CHARフィールド値の読取りおよび書込みを(後続の空白も含めて)リテラルに行うには、このオプションを無効にします。
プロパティ このDatabaseLoginのプロパティの使用を有効にするには、このオプションを選択します(「プロパティの構成」を参照)。

Oracleデータベースのプロキシ認証の構成

データベース・ログインは、Oracle JDBCドライバ・リリース10.1.0.2.0以上および外部接続プールとともにOC4Jネイティブまたは管理データ・ソースを使用したJSEアプリケーションおよびJEEアプリケーションのOracleデータベース・プラットフォームでのみ、Oracleデータベースのプロキシ認証を使用するよう構成できます。

TopLink Workbenchではこの機能をサポートしていません。TopLinkでOracleデータベースのプロキシ認証を使用するように構成するには、Javaを使用する必要があります(「Javaの使用」を参照)。

詳細は、「Oracleデータベースのプロキシ認証」を参照してください。

次の場合には、Oracleデータベースのプロキシ認証に対するTopLinkのサポートを使用できます。

排他独立クライアント・セッションを使用してセキュアなデータの認証済の読取りおよび書込みを提供する場合

この構成の場合、クライアント・セッションは、排他プロキシ接続を使用する独立したクライアント・セッションです(「独立クライアント・セッション」を参照)。プロキシ認証のユーザー資格証明を指定するConnectionPolicyを使用してクライアント・セッションを取得する必要があります。セキュアなデータの読取りおよび書込みは、プロキシ認証接続を通じて実行されます。セキュアでないデータの読取りは、非プロキシ認証接続を通じて実行されます。

Oracle Virtual Private Database(VPD)(「独立クライアント・セッションとOracle Virtual Private Database(VPD)」を参照)を使用する場合、この構成を使用して、データベース全体でVPDサポートを設定します。つまり、独立したクライアント・セッションがSQLを実行するのではなく(「PostAcquireExclusiveConnectionイベント・ハンドラ」および「PreReleaseExclusiveConnectionイベント・ハンドラ」を参照)、プロキシsession_userを使用したログイン・トリガー以降にデータベースが必要な設定を実行します。

データベースの監査目的でクライアント・セッションに認証済の書込みを提供する場合

この構成の場合、分離データまたは排他接続は要求されません。プロキシ認証のユーザー資格証明を指定するConnectionPolicyを使用してクライアント・セッションを取得する必要があります。

書込みは、プロキシ認証接続を通じて実行されます。読取りは、非プロキシ認証接続を通じて実行されます。これにより、データベース監査プロセスは、書込み操作を実行したユーザーにアクセスできます。

データベース・セッションに認証済の読取りおよび書込みを提供する場合

この構成の場合、DatabaseSessionオブジェクトとプロキシ認証ログインを組み合せて使用します。すべての読取りおよび書込みは、プロキシ認証接続を通じて実行されます。


注意:

3層環境でサーバーおよびクライアント・セッションを排他的に使用することをお薦めします。

データベース・セッションは、3層環境で使用しないでください。データベース・セッションは、単一のユーザーにのみ使用され、同時にアクセスされないように構成します。


Javaの使用

Oracleデータベースのプロキシ認証を構成するには、Javaコードでセッションをカスタマイズします(sessions.xmlファイルの使用時にSessionCustomizerを通じてカスタマイズするなど)。構成したTopLinkのDatasourceLogin JNDIConnectorは、JDBCドライバに適した(oracle.toplink.platform.database.oracleの)TopLinkプロキシ・コネクタ・インスタンスでラップし、プロキシ認証プロパティを構成できます。

Oracle JDBC OCIドライバを使用する場合、oracle.jdbc.pool.OracleOCIConnectionPoolに定義されているプロパティ定数とOracleOCIProxyConnectorを使用します。

Oracle JDBCシン・ドライバを使用する場合、oracle.jdbc.OracleConnectionに定義されているプロパティ定数とOracleJDBC10_1_0_2ProxyConnectorを使用します。

設定するプロパティは、表adを参照してください。


注意:

プロパティの定数名および値は、PROXYTYPE_定数(PROXYTYPE_USER_NAMEなど)を除いて、2つのクラス間で一貫しています。OracleOCIConnectionPoolの場合、これらのタイプはStringであり、OracleConnectionの場合、これらのタイプはintです。Oracle JDBCシン・ドライバとOracleJDBC10_1_0_2ProxyConnectorを使用する場合は、常にこれらのプロパティをStringとして設定する必要があります。次に例を示します。
login.setProperty(
    "proxytype", Integer.toString(OracleConnection.PROXYTYPE_USER_NAME));


TopLinkでOracleデータベースのプロキシ認証を使用するように構成するには、次の手順を実行します。

  1. 使用するプロキシ・タイプを決定し、適切なユーザーおよびロールを作成します。

    1. ユーザー名の認証:

      ユーザー名のみに基づいてプロキシ・ユーザーsarahを認証する場合、次を使用してOracleデータベースでユーザー・アカウントを作成します。

      alter user sarah grant connect through dbadminuser
          with roles clerk, reports;
      
      

      この場合、表83-2に示すように、プロキシのプロパティを設定する必要があります。

      表83-2 ユーザー名を認証するためのプロキシのプロパティ

      プロパティ名 プロパティ値

      "proxytype"

      PROXYTYPE_USER_NAME

      PROXY_USER_NAME

      "sarah"

      PROXY_ROLES

      String[] {"role1", "role2", ...}


    2. ユーザー名およびパスワードの認証:

      ユーザー名およびパスワードに基づいてプロキシ・ユーザーsarahを認証する場合、次を使用してOracleデータベースでユーザー・アカウントを作成します。

      alter user sarah grant connect through dbadminuser
          authenticated using password
          with roles clerk, reports;
      
      

      この場合、表83-3に示すように、プロキシのプロパティを設定する必要があります。

      表83-3 ユーザー名およびパスワードを認証するためのプロキシのプロパティ

      プロパティ名 プロパティ値

      "proxytype"

      PROXYTYPE_USER_NAME

      PROXY_USER_NAME

      "sarah"

      PROXY_PASSWORD

      "passwordforsarah"

      PROXY_ROLES

      String[] {"role1", "role2", ...}


    3. 識別名の認証:

      グローバルに一意の識別名に基づいてプロキシ・ユーザーsarahを認証する場合、次を使用してOracleデータベースでユーザー・アカウントを作成します。

      create user sarah identified globally as
          'CN=sarah,OU=americas,O=oracle,L=city,ST=ca,C=us';
      alter user sarah grant connect through dbadminuser
          authenticated using distinguished name
          with roles clerk, reports;
      
      

      この場合、表83-4に示すように、プロキシのプロパティを設定する必要があります。

      表83-4 識別名を認証するためのプロキシのプロパティ

      プロパティ名 プロパティ値

      "proxytype"

      PROXYTYPE_DISTINGUISHED_NAME

      PROXY_DISTINGUISHED_NAME

      "CN=sarah,OU=americas,O=oracle,L=city,ST=ca,C=us"

      PROXY_ROLES

      String[] {"role1", "role2", ...}


    4. 証明書の認証:

      暗号化された識別名に基づいてプロキシ・ユーザーsarahを認証する場合、次を使用してOracleデータベースでユーザー・アカウントを作成します。

      alter user sarah grant connect through dbadminuser
          authenticated using certificate
          with roles clerk, reports;
      
      

      この場合、表83-5に示すように、プロキシのプロパティを設定する必要があります。

      表83-5 証明書を認証するためのプロキシのプロパティ

      プロパティ名 プロパティ値

      "proxytype"

      PROXYTYPE_CERTIFICATE

      PROXY_CERTIFICATE

      byte[] {<EncryptedCertificate>}

      PROXY_ROLES

      String[] {"role1", "role2", ...}


  2. Javaコードを使用してセッション・ログインを構成します。これは、sessions.xmlファイルの使用時にSessionCustomizerを通じて実行します。

    次の例では、指定済のJNDIConnectorを適切なTopLinkプロキシ認証コネクタでラップする方法を示します。サーバー・セッションのデフォルトの接続ポリシーを同じプロキシ認証ログインに設定できます。

    Oracle VPDを使用する場合、排他接続を使用するための接続ポリシーと、セキュアなデータを分離するためのディスクリプタを設定する必要があります。

    Login login = server.getDatasourceLogin();
    // Make sure that external connection pooling is used
    login.setUsesExternalConnectionPooling(true);
    // Wrap JNDIConnector with either
    // OracleOCIProxyConnector or OracleJDBC10_1_0_2ProxyConnector
    login.setConnector(
        new OracleOCIProxyConnector(
            ((JNDIConnector)login.getConnector()).getName()));
    ConnectionPolicy policy = server.getDefaultConnectionPolicy();
    policy.setPoolName(null);
    policy.setLogin(login);
    // If using Oracle VPD support,set the connection policy to exclusive
    policy.setShouldUseExclusiveConnection(true);
    
    
  3. このユーザーの資格証明でConnectionPolicyを指定して、プロキシ認証のクライアント・セッションを取得します。

    ConnectionPolicy policy =
        (ConnectionPolicy)server.getDefaultConnectionPolicy().clone();
    Login login = (Login)policy.getLogin().clone;
    // Set proxy properties into connection policy's login
    login.setProperty("proxytype" , OracleOCIConnectionPool.PROXYTYPE_USER_NAME);
    login.setProperty(OracleOCIConnectionPool.PROXY_USER_NAME ,"sarah");
    policy.setLogin(login);
    Session session = server.acquireClientSession(policy);