Oracle Data Provider for .NETの構成
ODP.NETの特定のバージョンに対する設定は、いくつかの方法で構成することができ、それぞれ優先順位が異なります。
-
Windowsレジストリ・エントリは、ODP.NETの特定のバージョンに対応するマシン全体の設定です。
Windowsレジストリベースの構成は、ODP.NET管理対象ドライバをサポートしていません。
-
machine.config
設定は、.NET Framework全体の設定であり、Windowsレジストリ値より優先されます。 -
アプリケーションまたはWeb構成ファイルの設定は、アプリケーション固有の設定であり、
machine.config
の設定およびWindowsレジストリの設定より優先されます。ノート:
app/web/config
によるmachine.config
のオーバーライドには、例外が1つあります。oracle.manageddataaccess.client
およびoracle.unmanageddataaccess.client
セクションの場合、machine.config
で特定のODP.NETバージョンをサブセクション(<version number="4.121.2.0">
)に指定すると、全バージョンを汎用的に参照するapp/web.config
サブセクション(<version number="*">
)がオーバーライドされます。machine.config
サブセクションをオーバーライドするには、app/web/config
ファイルにそのバージョンのサブセクション、つまり<version number="4.121.2.0">
を作成します。 -
ODP.NETアプリケーション・コードで行われた属性の設定は、他のどの設定値よりも優先されます。
アプリケーションまたはWeb構成ファイルは、1つのコンピュータ上の複数のアプリケーションが同じODP.NETのバージョンを使用する場合に便利で、ときには必須となりますが、各アプリケーションには異なるODP.NET構成が必要です。ODP.NETの特定のバージョンに対してWindowsレジストリ値を設定すると、そのバージョンを使用するすべてのアプリケーションに影響します。ただし、アプリケーションまたはWeb構成ファイル内でODP.NET構成値を持つことにより該当するアプリケーションに対してのみその設定が適用されるため、より細分化して使用できます。
たとえば、アプリケーションまたはweb.config
ファイルのStatementCacheSize
構成設定が100
の場合、このアプリケーション固有の設定により、そのアプリケーションがロードするODP.NETのバージョンではStatementCacheSize
に対して100
が強制的に使用され、machine.config
およびレジストリ内の設定より優先されます。前のリリース同様、構成ファイル(machine.config
またはアプリケーションおよびWeb構成ファイル)に存在しない設定の場合は、ロードしたODP.NETのバージョンに対応するレジストリ内の値が使用されることに注意してください。
ODP.NETがmachine.config
ファイルを読み込むのは、ODP.NETのバージョンからではなく、ODP.NETを実行する.NET Frameworkのバージョンからであることに注意してください。
ODP.NETは、メモリーにロードされるとき、WindowsレジストリおよびXML構成ファイルのみを読み込みます。そのため、その後に行われた構成の変更は、アプリケーションを再起動するまで読み込まれず、使用されません。
ODP.NET .NET構成設定のすべてのBoolean属性は、true
、false
、1
および0
を有効な値として受け入れます。1
はtrue
と同等で、0
はfalse
と同等です。
ノート:
ODP.NET Coreは、Windowsレジストリも.NET構成ファイルもサポートしていません。ODP.NET Core構成は、.NET構成API、sqlnet.ora
ファイルおよびtnsnames.ora
ファイルを使用して設定できます。
Oracle Client構成ファイルで自動化されるインストール中の設定
Oracle Data Access Components (ODAC)を新しいOracleホームにインストールするとき、Oracle Universal Installer (OUI)は、Oracleのローカル・ネーミング(tnsnames.ora)、プロファイル(sqlnet.ora)およびディレクトリ(ldap.ora)のパラメータ・ファイルおよび設定を、既存のOracleホームから、新しくインストールされるODACホームにコピーします。ただし、ビット数が同じ場合に限られます。つまり、どちらも32ビット環境に、またはどちらも64ビット環境にインストールされている必要があります。
あるいは、直前にアクティブだったOracleホームだけではなく、既存の他のOracleホームから、新しいODAC Oracleホームに、既存の*.ora
ファイルをコピーすることもできます。OUIは、存在すれば最大で3つの既存のOracleホームについて、その場所の情報を提供します。新しいOracleホームが、ファイルのコピー元となった以前のOracleホームとは異なる構成を使用する場合には、*.ora
ファイルをカスタマイズできます。
既存のODACまたはRDBMS Oracleホームにインストールする場合、新しい*.ora
ファイルはコピーも作成もされません。
以前のOracleホームが存在しないコンピュータにインストールする場合、OUIはデータベース接続の別名情報をユーザーに要求します。この時点で、OUIによってtnsnames.ora
ファイルが作成されます。別名情報が指定されない場合、tnsnames.ora
ファイルは作成されません。ユーザーがデータベース接続情報をすべて用意していない場合でも、インストール中にはプレースホルダ値を挿入しておき、後からtnsnames.ora
を変更して実際の値でプレースホルダを置き換えることをお薦めします。
Oracle Client構成ファイルの設定
ODP.NETのパラメータ値tnsnames.ora
、sqlnet.ora
およびldap.ora
は、.NET構成ファイルで、または*.ora
ファイル自体の中で設定できます。*.ora
ファイルの場所は、標準のORACLE_HOME
/network/admin
ディレクトリと異なる場所にすることもできます。*.ora
設定の優先順位は、ODP.NETの設定の優先順位と似ています。主な相違は、*.ora
ファイル自体が検索順序に含まれている点です。tnsnames.ora
とsqlnet.ora
の優先順位は、次のとおりです。
管理対象ODP.NET:
-
OracleConfiguration.OracleDataSources
-
.NET構成ファイルの
<dataSources>
-
OracleConnection.TnsAdmin
プロパティで設定されたディレクトリ -
Tns_Admin
接続文字列属性用に設定されたディレクトリ -
OracleConfiguration.TnsAdmin
プロパティで設定されたディレクトリ -
.NET構成ファイルの
TNS_ADMIN
ディレクトリ設定 -
現行作業ディレクトリ
-
Windows環境変数またはコンテナ環境変数の
TNS_ADMIN
ディレクトリ設定
管理対象外ODP.NET:
-
.NET構成ファイルの
<dataSources>
および<settings>
-
.NET構成ファイルの
TNS_ADMIN
ディレクトリ設定 -
現行作業ディレクトリ
-
Windows環境変数またはコンテナ環境変数の
TNS_ADMIN
ディレクトリ設定 -
TNS_ADMIN
Windowsレジストリ設定(HKLM\SOFTWARE\ORACLE\KEY_<Oracle Version>HOME<#>\
) -
%ORACLE_HOME%\network\admin
ディレクトリ
管理対象ODP.NET ldap.ora
の優先順位は次のとおりです。
-
.NET構成ファイルの
<LDAPsettings>
および<settings>
-
OracleConnection.TnsAdmin
プロパティで設定されたディレクトリ -
Tns_Admin
接続文字列属性用に設定されたディレクトリ -
OracleConfiguration.TnsAdmin
プロパティで設定されたディレクトリ -
OracleConfiguration.LdapAdmin
プロパティに設定されたディレクトリ -
.NET構成ファイルの
TNS_ADMIN
ディレクトリ設定 -
.NET構成ファイルの
LDAP_ADMIN
ディレクトリ設定 -
現行作業ディレクトリ
-
Windows環境変数の
TNS_ADMIN
ディレクトリ設定 -
Windows環境変数の
LDAP_ADMIN
ディレクトリ設定
管理対象外ODP.NET ldap.ora
の優先順位は次のとおりです。
-
Windows環境変数の
LDAP_ADMIN
ディレクトリ設定 -
%ORACLE_HOME%\ldap\admin
ディレクトリ -
Windows環境変数の
TNS_ADMIN
ディレクトリ設定 -
%ORACLE_HOME%\network\admin
ディレクトリ
Oracle Client構成パラメータの設定をすべて格納するには、app.config
またはweb.config
ファイルを使用することをお薦めします。
最初のtnsnames.ora
、sqlnet.ora
およびldap.ora
が見つかって読み込まれると、優先順位がそれより低い*.ora
ファイルは読み込まれなくなります。つまり、Oracle Client構成はすべて、app.config
、web.config
、machine.config
で、または見つかった最初の*.ora
ファイル・セットで設定されている必要があるということです。優先順位がこれより低い*.ora
ファイルで設定される追加のパラメータ値は、読み込まれません。
ODP.NETを使用するための.NETフレームワークの構成
インストール時のマシン全体の自動ODP.NET構成は、ODAC 18cでは使用できなくなりました。この変更で、同じマシン上のアプリケーションが使用するODP.NETのバージョンが異なる場合、またはマシンワイド・アセンブリの登録や構成ではなくアプリケーション固有の構成設定に依存している場合の互換性が向上します。
ただし、管理者は引き続き、管理対象および管理対象外ODP.NETを手動でグローバル・アセンブリ・キャッシュ(GAC)に配置したり、必要に応じてセクション・ハンドラDbProviderFactories
、TNS_ADMIN
、LDAP_ADMIN
およびアセンブリ・リダイレクト(ポリシーdllのかわりに)の構成をmachine.config
に追加したりできます。
machine.configのODP.NET設定はほとんど、app.config
またはweb.config
のローカル設定によって上書きできます。ただし、machine.config
とapp.config
またはweb.config
との間で競合があると、アプリケーションが正しく実行されない場合があります。app.config
またはweb.config
を使用して、machine.config
レベルとアプリケーション・レベルの両方でODP.NETを構成する場合には、注意が必要です。
このような問題を回避するため、app.config
またはweb.config
ではODP.NETアプリケーション構成を設定することをお薦めします。次の各項では、このようなODP.NET構成セクションを設定する方法と、構成セクションおよびファイルのサンプルを示します。
構成セクション・ハンドラ
アプリケーションがODP.NET構成セクションを読み取るには、セクション・ハンドラを構成する必要があります。ODP.NET管理ドライブ固有の構成のoracle.manageddataaccess.client
セクションをアプリケーションで追加するには、次のエントリを.NET構成ファイルに追加する必要があります。
<configuration> <configSections> <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </configSections> </configuration>
ノート:
この項のすべての例で、ODP.NETアセンブリのバージョンは4.122.19.1という前提になっています。別のバージョンを使用している場合は、このバージョン番号を適宜変更する必要があります。
管理対象外ODP.NETで該当するセクション・ハンドラは、次のとおりです。
<configuration> <configSections> <section name="oracle.unmanageddataaccess.client" type="OracleInternal.Common.CustomSectionHandler, Oracle.DataAccess, Version=4.122.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </configSections> </configuration>
machine.config
とapp.config
、またはweb.config
の間で一致させる必要がある構成エントリの1つ、または競合を回避するためにapp.config
またはweb.config
にのみ存在する構成エントリのいずれかが、セクション・ハンドラの構成です。たとえば、アプリケーションがWebアプリケーションで、前述のエントリがweb.config
に追加されており、oracle.manageddataaccess.client
の同じ構成セクション・ハンドラもmachine.config
に存在するが、Version
属性値が異なる場合、実行時に「重複するoracle.manageddataaccess.client
セクションが定義されています」というエラー・メッセージが表示されることがあります。この問題を回避するには、oracle.manageddataaccess.client
のmachine.config
にある構成セクション・ハンドラ・エントリを、machine.config
から削除するか、あるいはmachine.config
とweb.config
のODP.NET構成セクション・ハンドラ・エントリが正確に一致する必要があります。machine.config
にあるこのエントリに依存する他のアプリケーションがマシン上に存在する場合は、このセクション・ハンドラ・エントリを、すべてのローカル・アプリケーションの.NET構成ファイルに移動する必要があります。
DbProviderFactories
DbProviderFactories
およびDbProviderFactory
クラスを使用するアプリケーションのapp.config
またはweb.config
に、次のエントリを追加する必要があります。また、<remove>
エントリがあるため、machine.config
のOracle.ManagedDataAccess.Client
に対するDbProviderFactories
エントリはすべて無視されます。
<configuration> <system.data> <DbProviderFactories> <remove invariant="Oracle.ManagedDataAccess.Client" /> <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.122.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </DbProviderFactories> </system.data> </configuration>
管理対象外ODP.NETの場合に該当するのは、次のとおりです。
<configuration> <system.data> <DbProviderFactories> <remove invariant="Oracle.DataAccess.Client" /> <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.122.191, Culture=neutral, PublicKeyToken=89b483f429c47342" /> </DbProviderFactories> </system.data> </configuration>
依存アセンブリ
インストール時に自動的に登録されるポリシーDllに慣れているユーザーは、構成を通じて同じことを実行できます。次に、バージョン4.122以上のODP.NETに依存し、ODP.NET 4.122.19.1を使用するためにリダイレクトされるアプリケーションの構成例を示します。この例では、GACに登録されているポリシーODP.NET dllを無視するようにエントリが追加されます。
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <publisherPolicy apply="no" /> <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" /> <bindingRedirect oldVersion="4.122.0.0 - 4.65535.65535.65535" newVersion="4.122.19.1" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
管理対象外ODP.NETの場合に該当するのは、次のとおりです。
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <publisherPolicy apply="no" /> <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" culture="neutral" /> <bindingRedirect oldVersion="4.122.0.0 - 4.65535.65535.65535" newVersion="4.122.19.1" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
構成セクション・ハンドラ、DbProviderFactories、依存アセンブリおよびプロバイダ構成を含む最終的な.NET構成セクションは、次の例のようになります。
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342"/> </configSections> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/> </startup> <system.data> <DbProviderFactories> <remove invariant="Oracle.ManagedDataAccess.Client"/> <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.122.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342"/> </DbProviderFactories> </system.data> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <publisherPolicy apply="no"/> <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral"/> <bindingRedirect oldVersion="4.121.0.0 - 4.65535.65535.65535" newVersion="4.122.19.1"/> </dependentAssembly> </assemblyBinding> </runtime> <oracle.manageddataaccess.client> <version number="*"> <dataSources> <dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) "/> </dataSources> </version> </oracle.manageddataaccess.client> </configuration>