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_ADMINWindowsレジストリ設定(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>