リレーショナル・データベース・プロジェクトでは、TopLinkにより、ディスクリプタごとにデータベースから表情報が取得されます。各TopLink Workbenchプロジェクトには、関連するデータベースが含まれます。各データベースには、複数のログインを作成できます。
この章の内容は次のとおりです。
表98-1は、データベース・ログインの構成可能オプションを示します。
表98-1は、データベース・ログインの構成可能オプションを示します。
表98-1 データベース・ログインの構成可能オプション
構成オプション | Oracle JDeveloper |
TopLink Workbench |
Java |
---|---|---|---|
リレーショナル・データベース(98.2項「セッション・レベルでのリレーショナル・データベース・プラットフォームの構成」を参照) |
|||
データベース・ログインの接続オプション(98.3項「データベース・ログインの接続オプションの構成」を参照) |
|||
順序付け(98.4項「セッション・レベルでの順序付けの構成」を参照) |
|||
JDBCオプション(98.6項「JDBCオプションの構成」を参照) |
|||
ユーザー名およびパスワード(97.2項「ユーザー名およびパスワードの構成」を参照) |
|||
表修飾子(98.5項「表修飾子の構成」を参照) |
|||
詳細オプション(98.7項「詳細オプションの構成」を参照) |
|||
パスワード暗号化(97.3項「パスワード暗号化の構成」を参照) |
|||
外部接続プーリング(97.4項「外部接続プーリングの構成」を参照) |
|||
プロパティ(97.5項「プロパティの構成」を参照) |
|||
Oracleデータベースのプロキシ認証(98.8項「Oracleデータベースのプロキシ認証の構成」を参照) |
各データベース・セッションには、データベース・プラットフォーム(Oracleデータベースなど)を指定する必要があります。このプラットフォーム構成により、プロジェクト・レベルでプラットフォームがオーバーライドされます(構成されている場合)。
詳細は、次を参照してください。
リレーショナル・サーバー(またはデータベース)のセッション・ログインにデータベース・プラットフォームのオプションを指定するには、次の手順を実行します。
ナビゲータでリレーショナル・サーバー(またはデータベース)セッションを選択します。そのプロパティがエディタに表示されます。
「ログイン」タブをクリックします。「ログイン」タブが表示されます。
「接続」サブタブをクリックします。「接続」サブタブが表示されます。
オプションのメニューからデータベース・プラットフォームを選択します。このメニューには、TopLinkクラスパスのDatabasePlatform
のすべてのインスタンスが含まれます。
POJO TopLinkアプリケーションについては接続情報をセッション・レベルで構成します。この情報は、sessions.xml
ファイルに格納されます。TopLinkランタイムでは、POJO TopLinkアプリケーションのセッションを使用して永続性操作を実行する場合は常にこの情報が使用されます。
この接続構成により、プロジェクト・レベルで接続情報がオーバーライドされます(構成されている場合)。プロジェクト・レベルの構成の詳細は、20.5項「開発ログインおよびデプロイ・ログインの構成」を参照してください。
この接続構成は、接続プール・レベルの接続情報によってオーバーライドされます。詳細は、101.5項「接続プールの接続オプションの構成」を参照してください。
リレーショナル・サーバー(またはデータベース)のセッション・ログインに接続オプションを指定するには、次の手順を実行します。
ナビゲータでリレーショナル・サーバー(またはデータベース)セッションを選択します。そのプロパティがエディタに表示されます。
「ログイン」タブをクリックします。「ログイン」タブが表示されます。
「接続」サブタブをクリックします。「接続」サブタブが表示されます。
次の情報を参照し、タブの「ドライバ」フィールドにデータを入力します。
フィールド | 説明 |
---|---|
データベース・ドライバ | 適切なデータベース・ドライバを指定します。
注意: 「J2EEデータ・ソース」を選択する場合、外部接続プールを使用する必要があります。この「データベース・ドライバ」オプションの場合、内部接続プールは使用できません(詳細は、97.4項「外部接続プーリングの構成」を参照してください)。 |
ドライバ・クラス脚注1 | 「データベース・ドライバ」が「ドライバ・マネージャ」に設定されている場合はこのフィールドを構成します。オプションのメニューから選択します。このメニューには、TopLinkクラスパスのすべてのJDBCドライバが含まれます。 |
ドライバURL脚注1 | 「データベース・ドライバ」が「ドライバ・マネージャ」に設定されている場合はこのフィールドを構成します。選択した「ドライバ・クラス」に関連するオプションのメニューから選択し、データ・ソースに合せてURLを編集します。 |
データ・ソース名脚注2 | 「データベース・ドライバ」が「J2EEデータ・ソース」に設定されている場合はこのフィールドを構成します。ターゲット・アプリケーション・サーバーで事前に構成されているJava EEデータ・ソースを示す有効なJNDI名を指定します(例: jdbc/EmployeeDB )。
慣例により、このような名前はすべて(提供されるすべてのリソース・ファクトリのルートである標準の |
ルックアップ・タイプ脚注2 | 「データベース・ドライバ」が「J2EEデータ・ソース」に設定されている場合はこのフィールドを構成します。JNDI名を決定するためのルックアップ方法を指定します。
|
脚注1 「データベース・ドライバ」が「ドライバ・マネージャ」に設定されている場合のみ適用されます。
脚注2 「データベース・ドライバ」が「J2EEデータ・ソース」に設定されている場合のみ適用されます。
TopLinkの順序付けをセッションまたはプロジェクト・レベルで構成することにより、順序値(使用する順序のタイプ)を取得する方法をTopLinkに指示します。
CMPプロジェクトの場合、セッションは直接構成しません。この場合、順序をプロジェクト・レベルで構成する必要があります(20.3項「プロジェクト・レベルでの順序付けの構成」を参照)。POJOプロジェクトの場合、セッションは直接構成できます。この場合、必要に応じて、セッション・レベルの順序構成を使用して、セッション別のプロジェクト・レベルの順序構成をオーバーライドできます。
Oracle JDeveloperを使用してセッション・レベルで順序付けを構成できます。
TopLink Workbench(98.4.1項「TopLink Workbenchを使用したセッション・レベルでの順序付けの構成方法」を参照)を使用する場合、表の順序付け(18.2.2.1項「表の順序付け」を参照)およびネイティブ順序付け(18.2.2.5項「Oracleデータベース・プラットフォームによるネイティブ順序付け」および18.2.2.6項「Oracle以外のデータベース・プラットフォームによるネイティブ順序付け」を参照)を構成することや、すべての順序に適用される事前割当てサイズを構成することが可能です(18.2.3項「順序付けと事前割当てサイズ」を参照)。
Javaを使用する場合(98.4.2項「Javaを使用したセッション・レベルでの順序付けの構成方法」を参照)、TopLinkがサポートしている任意の順序タイプを構成できます(18.2.2項「順序付けタイプ」を参照)。順序を任意の数および組合せで作成できます。順序オブジェクトを明示的に作成することや、プラットフォームが作成するデフォルトの順序を使用することが可能です。同じ順序を複数のディスクリプタに関連付け、ディスクリプタの順序ごとに個別の事前割当てサイズを構成できます。
セッション(またはプロジェクト)・レベルで順序タイプを構成した後、順序付けを有効にするには、順序フィールドおよび順序名を使用してディスクリプタを構成する必要があります(23.3項「ディスクリプタ・レベルでの順序付けの構成」を参照)。
順序付けの詳細は、18.2項「リレーショナル・プロジェクトにおける順序付け」を参照してください。
リレーショナル・サーバー(またはデータベース)・セッションに順序付け情報を指定するには、次の手順を実行します。
「ナビゲータ」でセッション・オブジェクトを選択します。
「エディタ」で「ログイン」タブを選択します。
「順序付け」サブタブをクリックします。「順序付け」サブタブが表示されます。
次の情報を参照し、「順序付け」サブタブの各フィールドにデータを入力して永続性タイプを構成します。
フィールド | 説明 |
---|---|
事前割当てサイズ | デフォルトの事前割当てサイズを選択します(18.2.3項「順序付けと事前割当てサイズ」を参照)。デフォルトは50です。構成する事前割当てサイズはすべての順序に適用されます。 |
デフォルトの順序表 | デフォルトの順序表名SEQUENCE 、デフォルトの順序名フィールドSEQ_NAME 、およびデフォルトの順序数フィールドSEQ_COUNT を使用して表の順序付けを使用する場合、このオプションを選択します(18.2.2.1項「表の順序付け」を参照)。 |
ネイティブ順序付け | データベース・プラットフォームによって作成される順序付けオブジェクトを使用する場合、このオプションを選択します(18.2.2.5項「Oracleデータベース・プラットフォームによるネイティブ順序付け」または18.2.2.6項「Oracle以外のデータベース・プラットフォームによるネイティブ順序付け」を参照)。このオプションは、サポートされているデータベース・プラットフォームに適用されます(96.1.3.1項「データベース・プラットフォーム」を参照)。 |
カスタム順序表 | 指定する順序表名、順序名フィールドおよび順序数フィールド名を使用して表の順序付けを使用する場合、このオプションを選択します(18.2.2.1項「表の順序付け」を参照)。 |
名前 | 順序表の名前を選択します。 |
名前フィールド | 順序名を格納するために使用する列の名前を選択します。 |
カウンタ・フィールド | 順序数を格納するために使用する列の名前を選択します。 |
Javaを使用する場合、次の順序構成を実行できます。
プラットフォームを使用してログインを構成した後(98.2項「セッション・レベルでのリレーショナル・データベース・プラットフォームの構成」を参照)、プラットフォームが提供するデフォルトの順序を使用できます。
指定されていない順序にディスクリプタを関連付けると、TopLinkランタイムはDefaultSequence
のインスタンスを作成し、このディスクリプタの順序付けを提供します。詳細は、23.3.3.3項「プラットフォームのデフォルト順序の構成」を参照してください。
例98-1に示すように、デフォルトのプラットフォームの順序には直接アクセスできます。たとえば、デフォルトでは、DatabasePlatform
により、デフォルトの表および列名を使用して表の順序が作成されます(18.2.2.1項「表の順序付け」を参照)。
例98-1 プラットフォームのデフォルトの順序へのアクセス
// assume that dbLogin owns a DatabasePlatform
TableSequence tableSeq2 = ((TableSequence)dbLogin.getDefaultSequence()).clone();
tableSeq2.setName("EMP_SEQ");
tableSeq2.setPreallocationSize(75);
dbLogin.addSequence(tableSeq2);
プラットフォームのデフォルトの順序のクローニングを回避するには、例98-2に示すように、DefaultSequence
クラス(プラットフォームのデフォルトの順序のラッパー)を使用します。EMP_SEQ
という名前の新規順序がプラットフォームのデフォルトの順序と同じタイプになります。
例98-3に示すように、デフォルトのプラットフォームの順序をオーバーライドできます。この例では、dbLogin
は、タイプTableSequence
のデフォルトの順序を提供するDatabasePlatform
を所有しています。デフォルトの順序をタイプUnaryTableSequence
に設定した後、DefaultSequence
クラスを使用すると、新しいデフォルトの順序タイプにアクセスします。この例では、EMP_SEQ
という名前の順序がタイプUnaryTableSequence
になり、事前割当てサイズは75になります。
例98-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 );
プラットフォームのデフォルトの順序を使用する以外にも(98.4.2.1項「プラットフォームのデフォルトの順序の使用」を参照)、例98-4に示すように、順序インスタンスを明示的に作成し、それぞれが独自の事前割当てサイズを持つ順序タイプの組合せを使用してLogin
を構成できます。この例では、EMP_SEQ
という名前の順序はEmployee
クラスのインスタンスに対してのみ順序値を提供し、ADD_SEQ
はAddress
クラスのインスタンスに対してのみ順序値を提供します。PHONE_SEQ
という名前の順序は、事前割当てサイズが30のプラットフォームのデフォルトの順序を使用し、Phone
クラスの順序値を提供します。
例98-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
)を所有している場合、例98-5に示すように、プラットフォームのデフォルトの順序タイプを使用して順序を構成できます。この例では、順序EMP_SEQ
およびPHONE_SEQ
は同じTableSequence
表を共有しています。EMP_SEQ
およびPHONE_SEQ
は、この表の行を示します。
QuerySequence
を拡張する任意の順序タイプについて、順序値の更新または読取りに、TopLinkが使用する問合せを構成できます。
ほとんどのアプリケーションでは、TopLinkが自動的に使用する問合せで十分です。ただし、順序付け用としてストアド・プロシージャを使用する場合など、アプリケーションに特別な順序付けが必要な場合、TopLinkの順序で使用する更新および読取り問合せを構成できます。
例98-7は、1回のSQLの選択問合せで順序を更新し、新規順序値を返すストアド・プロシージャを指定する方法を示します。この例では、ストアド・プロシージャにはUPDATE_SEQ
という名前が付いています。これには、1つの入力引数(更新対象の順序名であるSEQ_NAME
)および1つの出力引数(更新後の順序値であるSEQ_COUNT
)が含まれています。このストアド・プロシージャは、SEQ_NAME
という名前の順序に関連付けられている順序値を増やし、SEQ_COUNT
という名前の出力引数で新規順序値を返します。
例98-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);
例98-7および例98-8は、順序の更新アクションと選択アクション用としてストアド・プロシージャを個別に指定する方法を示します。
例98-7では、ストアド・プロシージャの名前はUPDATE_SEQであり、更新する順序の名前(SEQ_NAME
)が1つの引数として含まれます。ストアド・プロシージャは、SEQ_NAME
という名前の順序に関連付けられている順序値を増やします。
例98-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);
例98-8では、ストアド・プロシージャの名前はSELECT_SEQ
であり、選択する順序の名前(SEQ_NAME
)を1つの引数としてとります。ストアド・プロシージャは、1つのデータ値(順序名SEQ_NAME
に関連付けられている現在の順序値)を読み取ります。
例98-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)
また、例98-9に示すように、QuerySequence
を直接作成し、ログインに追加することもできます。
一部のデータベース(Oracle DatabaseやDB2など)では、すべての表を識別子で修飾する必要があります。これには、表の作成者や表が存在するデータベース名などがあります。表修飾子を指定すると、TopLinkは、参照するすべての表に対してこの修飾子を使用します。表修飾子を指定するのは、表修飾子が必要で、すべての表の修飾子が同じである場合のみです。
表修飾子を指定するには、次の手順を実行します。
ナビゲータでリレーショナル・サーバー(またはデータベース)セッションを選択します。そのプロパティがエディタに表示されます。
「ログイン」タブをクリックします。「ログイン」タブが表示されます。
「オプション」サブタブをクリックします。「オプション」サブタブが表示されます。
「表修飾子」フィールドで、このデータベースのすべての表に対する参照を修飾するための識別子を入力します。
ほとんどのJDBCドライバは、ユーザーのニーズに合せてドライバ操作をカスタマイズするための様々なオプションのランタイム構成をサポートしています。TopLinkは、多くの最も重要なオプションのみでなく、この項で説明するように、より詳細なオプション(98.7項「詳細オプションの構成」を参照)を(API、Oracle JDeveloper、およびTopLink Workbenchで)直接サポートしています。
また、プロパティを指定することにより、追加オプションを構成することもできます(97.5項「プロパティの構成」を参照)。
注意: すべてのドライバがすべてのJDBCオプションをサポートするとはかぎりません。選択するオプションの組合せにより、ドライバの動作が異なる場合があります。JDBCオプションを選択する前に、使用するJDBCドライバのドキュメントを参照してください。 |
リレーショナル・サーバー(またはデータベース)のセッション・ログインにJDBCオプションを指定するには、次の手順を実行します。
ナビゲータでリレーショナル・サーバー(またはデータベース)セッションを選択します。そのプロパティがエディタに表示されます。
「ログイン」タブをクリックします。「ログイン」タブが表示されます。
「オプション」サブタブをクリックします。「オプション」サブタブが表示されます。
次の表を参照し、「オプション」サブタブ上のフィールドにデータを入力してJDBCオプションを選択し、このセッションログインで使用します。
オプション | 説明 |
---|---|
問合せのすべてのパラメータをバインド脚注1 | デフォルトでは、TopLinkは問合せのパラメータをすべてバインドします。
TopLinkでパラメータをバインドしないようにするには、このオプションの選択を解除します。 |
すべての文をキャッシュ脚注1 | このオプションを選択すると、プリコンパイルされた各文がキャッシュされるため、再実行時にSQL文のプリコンパイル時間を短縮し、パフォーマンスを向上させることができます。 |
バイト配列バインディング脚注1 | バイナリ・ラージ・オブジェクト(BLOB)データを問い合せる場合、このオプションを選択します。 |
バインド用ストリーム脚注1 | java.io.InputStream およびjava.io.OutputStream を使用したBLOBデータの処理時により効率的なJDBCドライバを使用する場合、このオプションを選択します。 |
ネイティブSQL | デフォルトでは、TopLinkは、JDBC SQL文法を使用してSQLを生成します。データベース・ドライバが完全なJDBC SQL文法をサポートしていない場合など、TopLinkがデータベース固有のSQL文法を使用するようにする場合、このオプションを選択します。 |
バッチ書込み脚注2 | INSERT 、UPDATE およびDELETE 文のグループを個別にではなく1つのトランザクションでデータベースに送信する操作をサポートしているJDBCドライバを使用する場合、このオプションを選択します。
JDBCドライバのバッチ書込み機能を使用する場合、「JDBC」を選択します。 TopLinkが提供するバッチ書込み機能を使用する場合、「TopLink」を選択します。JDBCドライバがバッチ書込みをサポートしていない場合、このオプションを選択します。 注意: Oracle 9 Databaseプラットフォームを使用しており、TopLinkバッチ書込みをオプティミスティック・ロックと組み合せて使用する場合は、パラメータ・バインドを有効にする必要があります。 |
文字列バインディング脚注1 | 大規模なjava.lang.String オブジェクトを問い合せる場合、このオプションを選択します。
|
脚注1 詳細は、12.11.5項「パラメータ使用のSQL(パラメータ・バインド)とプリコンパイルされたSQL文のキャッシュを使用した最適化方法」を参照してください。
脚注2 MySQL4
データベース・プラットフォーム(96.1.3項「データ・ソース・プラットフォームのタイプ」を参照)を使用する場合は、JDBCバッチ書込みを使用してください(TopLinkバッチ書込みは使用しないでください)。詳細は、12.11.3項「バッチ書込みを使用した最適化方法」を参照してください。
すべての問合せに対してプリコンパイルされた文のキャッシュを有効にするには、例98-10に示すように、Login
レベルで構成します。詳細は、12.11.5項「パラメータ使用のSQL(パラメータ・バインド)とプリコンパイルされたSQL文のキャッシュを使用した最適化方法」を参照してください。
例98-10 ログイン・レベルでのプリコンパイルされたSQL文のキャッシュ
databaseLogin.cacheAllStatements(); databaseLogin.setStatementCacheSize(100);
TopLinkでは、パラメータ・バインドはデフォルトで有効になっています。バインドを無効にするには、例98-11に示すように、Login
レベルで構成します。詳細は、12.11.5項「パラメータ使用のSQL(パラメータ・バインド)とプリコンパイルされたSQL文のキャッシュを使用した最適化方法」を参照してください。
JDBCバッチ書込みを有効にするには、例98-12に示すように、Login
のメソッドuseBatchWriting
を使用します。
ほとんどのJDBCドライバは、ユーザーのニーズに合せてドライバ操作をカスタマイズするための様々なオプションのランタイム構成をサポートしています。TopLinkでは、多くの最も重要なオプション(98.6項「JDBCオプションの構成」を参照)のみでなく、この項で説明するように、より詳細なオプションも(API、Oracle JDeveloper、およびTopLink Workbenchで)直接サポートしています。
また、プロパティを指定することにより、追加オプションを構成することもできます(97.5項「プロパティの構成」を参照)。
注意: すべてのドライバがすべてのJDBCオプションをサポートするとはかぎりません。選択するオプションの組合せにより、ドライバの動作が異なる場合があります。JDBCオプションを選択する前に、使用するJDBCドライバのドキュメントを参照してください。 |
リレーショナル・サーバー(またはデータベース)のセッション・ログインに詳細オプションを指定するには、次の手順を実行します。
ナビゲータでリレーショナル・サーバー(またはデータベース)セッションを選択します。そのプロパティがエディタに表示されます。
「ログイン」タブをクリックします。「ログイン」タブが表示されます。
「オプション」サブタブをクリックします。「オプション」サブタブが表示されます。
次の表を参照し、「オプション」サブタブ上のフィールドにデータを入力して詳細オプションを選択し、このセッションログインで使用します。
オプション | 説明 |
---|---|
フィールド名を大文字に変換 | デフォルトでは、TopLinkは、データベースから返されたフィールド名に応じて大文字または小文字を使用します。フィールド名が大文字であることをアプリケーションが予期しているが、データベースが大文字を返さない場合(異なるデータベースにアクセスしている場合など)は、このオプションを有効にします。 |
データ変換の最適化 | デフォルトでは、TopLinkは、アプリケーションが必要とする形式でJDBCからデータにアクセスして、データ・アクセスを最適化します。データ変換が行われなくなった古いJDBCドライバを使用しているために、この最適化と競合する場合は、この最適化を無効にします。 |
文字列のトリミング | デフォルトでは、TopLinkは、CHAR フィールド値から後続の空白を削除します。CHAR フィールド値の読取りおよび書込みを(後続の空白も含めて)リテラルに行うには、このオプションを無効にします。 |
プロパティ | このDatabaseLogin のプロパティの使用を有効にするには、このオプションを選択します(97.5項「プロパティの構成」を参照)。 |
詳細オプションを構成するには、DatabaseLogin
の次のメソッドを使用します。
setShouldForceFieldNamesToUpperCase
: デフォルトでは、TopLinkは、データベースから返されたフィールド名に応じて大文字または小文字を使用します。フィールド名が大文字であることをアプリケーションが予期しているが、データベースが大文字を返さない場合(異なるデータベースにアクセスしている場合など)は、このメソッドを使用します。
setShouldOptimizeDataConversion
: デフォルトでは、TopLinkは、アプリケーションが必要とする形式でJDBCからデータにアクセスして、データ・アクセスを最適化します。データ変換が正確に行われなくなった古いJDBCドライバを使用しているために、この最適化と競合する場合は、この値をfalse
に設定します。
setShouldTrimStrings
: デフォルトでは、TopLinkは、CHAR
フィールド値から後続の空白を削除します。CHAR
フィールド値の読取りおよび書込みを(後続の空白も含めて)リテラルに行うには、この値をfalse
に設定します。
setProperties
: このDatabaseLogin
のプロパティの使用を有効にするには、この値をtrue
に設定します(97.5項「プロパティの構成」を参照)。
データベース・ログインは、Oracle JDBCドライバ・リリース10.1.0.2.0以上および外部接続プールとともにOC4JネイティブまたはJTA以外(tx-level=local
を使用して設定)の管理データ・ソースを使用したJSEアプリケーションおよびJEEアプリケーションのOracleデータベース・プラットフォームでのみ、Oracleデータベースのプロキシ認証を使用するように構成できます。
Oracle JDeveloperまたはTopLink Workbenchではこの機能をサポートしていません。TopLinkでOracleデータベースのプロキシ認証を使用するように構成するには、Javaを使用する必要があります(98.8.1項「Javaを使用したOracleデータベースのプロキシ認証の構成方法」を参照)。
詳細は、96.1.4.2項「Oracleデータベースのプロキシ認証」を参照してください。
次の場合には、Oracleデータベースのプロキシ認証に対するTopLinkのサポートを使用できます。
排他独立クライアント・セッションを使用してセキュアなデータの認証済の読取りおよび書込みを提供する場合
この構成の場合、クライアント・セッションは、排他プロキシ接続を使用する独立したクライアント・セッションです(87.5項「独立クライアント・セッション」を参照)。プロキシ認証のユーザー資格証明を指定するConnectionPolicy
を使用してクライアント・セッションを取得する必要があります。セキュアなデータの読取りおよび書込みは、プロキシ認証接続を通じて実行されます。セキュアでないデータの読取りは、非プロキシ認証接続を通じて実行されます。
Oracle Virtual Private Database(VPD)(87.5.1項「独立クライアント・セッションとOracle Virtual Private Database(VPD)」を参照)を使用する場合、この構成を使用して、データベース全体でVPDサポートを設定します。つまり、独立したクライアント・セッションがSQLを実行するのではなく(92.2項「PostAcquireExclusiveConnectionイベント・ハンドラの使用」および92.3項「PreReleaseExclusiveConnectionイベント・ハンドラの使用」を参照)、プロキシsession_user
を使用したログイン・トリガー以降にデータベースが必要な設定を実行します。
データベースの監査目的でクライアント・セッションに認証済の書込みを提供する場合
この構成の場合、分離データまたは排他接続は要求されません。プロキシ認証のユーザー資格証明を指定するConnectionPolicy
を使用してクライアント・セッションを取得する必要があります。
書込みは、プロキシ認証接続を通じて実行されます。読取りは、非プロキシ認証接続を通じて実行されます。これにより、データベース監査プロセスは、書込み操作を実行したユーザーにアクセスできます。
データベース・セッションに認証済の読取りおよび書込みを提供する場合
この構成の場合、DatabaseSession
オブジェクトとプロキシ認証ログインを組み合せて使用します。すべての読取りおよび書込みは、プロキシ認証接続を通じて実行されます。
注意: 3層環境でサーバーおよびクライアント・セッションを排他的に使用することをお薦めします。データベース・セッションは、3層環境で使用しないでください。データベース・セッションは、単一のユーザーにのみ使用され、同時にアクセスされないように構成します。 |
Oracleデータベースのプロキシ認証を構成するには、Javaコードでセッションをカスタマイズします(sessions.xml
ファイルの使用時にSessionCustomizer
を通じてカスタマイズするなど)。構成したTopLinkのDatasourceLogin
JNDIConnector
は、JDBCドライバに適した(oracle.toplink.platform.database.oracle
の)TopLinkプロキシ・コネクタ・インスタンスでラップし、プロキシ認証プロパティを構成できます。
Oracle JDBCシン・ドライバとOCIドライバのどちらを使用しているかに関係なく、oracle.jdbc.OracleConnection
に定義されているプロパティ定数と、OracleJDBC10_1_0_2ProxyConnector
を使用します。
注意: プロパティの定数名および値は、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データベースのプロキシ認証を使用するように構成するには、次の手順を実行します。
使用するプロキシ・タイプを決定し、適切なユーザーおよびロールを作成します。
ユーザー名の認証:
ユーザー名のみに基づいてプロキシ・ユーザーsarah
を認証する場合、次を使用してOracleデータベースでユーザー・アカウントを作成します。
alter user sarah grant connect through dbadminuser with roles clerk, reports;
この場合、表98-2に示すように、プロキシのプロパティを設定する必要があります。
ユーザー名およびパスワードの認証:
ユーザー名およびパスワードに基づいてプロキシ・ユーザーsarah
を認証する場合、次を使用してOracleデータベースでユーザー・アカウントを作成します。
alter user sarah grant connect through dbadminuser authenticated using password with roles clerk, reports;
この場合、表98-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;
この場合、表98-4に示すように、プロキシのプロパティを設定する必要があります。
証明書の認証:
暗号化された識別名に基づいてプロキシ・ユーザーsarah
を認証する場合、次を使用してOracleデータベースでユーザー・アカウントを作成します。
alter user sarah grant connect through dbadminuser authenticated using certificate with roles clerk, reports;
この場合、表98-2に示すように、プロキシのプロパティを設定する必要があります。
Javaコードを使用してセッション・ログインを構成します。これは、sessions.xml
ファイルの使用時にSessionCustomizer
を通じて実行します。
次の例では、指定済のJNDIConnector
を適切なTopLinkプロキシ認証コネクタでラップする方法を示します。サーバー・セッションのデフォルトの接続ポリシーを同じプロキシ認証ログインに設定できます。
Oracle VPD(87.5.1項「独立クライアント・セッションとOracle Virtual Private Database(VPD)」)を使用する場合、排他接続を使用するための接続ポリシーと、セキュアなデータを分離するためのディスクリプタを設定する必要があります(119.13項「ディスクリプタ・レベルでのキャッシュ分離機能の構成」)。
Login login = server.getDatasourceLogin(); // Make sure that external connection pooling is used login.setUsesExternalConnectionPooling(true); // Wrap JNDIConnector with OracleJDBC10_1_0_2ProxyConnector login.setConnector( new OracleJDBC10_1_0_2ProxyConnector( ((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);
アプリケーション・サーバーによって提供されたデータ・ソースの使用時に問題が発生する場合があります。その場合、次のコードは使用しません。
login.setConnector(new OracleJDBC10_1_0_2ProxyConnector (((JNDIConnectorlogin.getConnector()).getName()));
かわりに、次のようにデータ・ソースを作成します。
oracle.jdbc.pool.OracleDataSource ds = new oracle.jdbc.pool.OracleDataSource(); ds.setUser("MyMainUser"); ds.setPassword("MyPassword"); ds.setUrl("jdbc:oracle:thin:@MyServer:1521:MyDb"); login.setConnector( new OracleJDBC10_1_0_2ProxyConnector(ds));
このユーザーの資格証明で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);