0

Oracle.ManagedDataAccess.Client を使用すると、次の VB.NET 行で内部例外がスローされます。

Dim conn As New OracleConnection(connStr)
conn.ConnectionString = "Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl))); User id=username; Password=password"
conn.Open()

conn.Open ステートメントは成功しますが、次の例外がスローされます。

A first chance exception of type 'System.Net.Sockets.SocketException' occurred in System.dll

さらに重要なことは、最初の接続を開くのに 1.5 秒かかることです。

接続を閉じて新しい接続を開けば問題ありません。

最初の接続がほんの一瞬で行われる管理されていない Oracle データ プロバイダーでは、このような問題はありませんでした。Oracle 11g または 12c データベース サーバーに接続している場合は違いがないため、データ プロバイダーが原因であるかのように見えます。

データ プロバイダーは何かを試みて失敗し、その後、セッションの残りの部分で別のデフォルトになりますか? その場合、最初に成功したパスを強制するためにできることはありますか?

最初の接続の待ち時間が長いのは、単に Oracle プール マネージャーの初期化コストが原因ですか? もしそうなら、その部分を修正するために私にできることは何もないと思いますが、その場合でも、SocketExceptionを取り除くために何かできるかどうか知りたいです.

SocketException がヒットしたときの .NET 側のスタック トレースは次のようになります。

System.dll!System.Net.Sockets.Socket.EndConnect(System.IAsyncResult asyncResult)
System.dll!System.Net.Sockets.TcpClient.EndConnect(System.IAsyncResult asyncResult)
Oracle.ManagedDataAccess.dll!OracleInternal.Network.TcpTransportAdapter.Connect(OracleInternal.Network.ConnectionOption conOption)
Oracle.ManagedDataAccess.dll!OracleInternal.Network.OracleCommunication.ConnectViaCO(OracleInternal.Network.ConnectionOption connOption, OracleInternal.Network.AddressResolution addrRes)
Oracle.ManagedDataAccess.dll!OracleInternal.Network.OracleCommunication.DoConnect(string tnsDescriptor)
Oracle.ManagedDataAccess.dll!OracleInternal.Network.OracleCommunication.Connect(string tnsDescriptor, bool externalAuth, string instanceName)
Oracle.ManagedDataAccess.dll!OracleInternal.ServiceObjects.OracleConnectionImpl.Connect(Oracle.ManagedDataAccess.Client.ConnectionString cs, bool bOpenEndUserSession, string instanceName)
Oracle.ManagedDataAccess.dll!OracleInternal.ConnectionPool.PoolManager<OracleInternal.ConnectionPool.OraclePoolManager,OracleInternal.ConnectionPool.OraclePool,OracleInternal.ServiceObjects.OracleConnectionImpl>.CreateNewPRThreadFunc(object state)
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
mscorlib.dll!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch()

Oracle .trc ファイルを見ると、異常はないようです。

4

2 に答える 2

1

主な問題は、listener.ora および tnsnames.ora の構成にあるようです。

これは、ローカルの 12c 標準データベース サーバーのインストールであり、listener.ora 構成ファイルには IPC プロトコル エントリが含まれていました。Network Configuration Assistant を実行してリスナーを再構成すると、このエントリは表示されなくなりました。また、TCP プロトコルのホスト名が localhost から実マシン名に変更されました。

tnsnames.ora に関しては、Network Configuration Assistant が記述子のホスト名を localhost から実際のマシン名に更新し、SERVER = DEDICATED 値を削除しました。

12c データベース サーバーの標準/標準インストール中に localhost を指定しなかったことは確かですが、応答ファイルには "ORACLE_HOSTNAME=localhost" というエントリが含まれているため、これを指定したか、インストーラがデフォルトでこの値に設定されていました。

しかし、SocketException に関する限り、主な原因は、listener.ora 構成ファイル内の IPC プロトコル エントリの存在にあるようです。

内部で初めて SocketException が発生することはなくなり、OracleConnection.Open の実行時間は 0.5 秒未満になりました。つまり、元のケースよりも 1 秒短くなりました。

編集

標準の 12c データベースの通常のインストールで、

  • デフォルトでは、ORACLE_HOSTNAME を localhost に設定します。これは、listener.ora および tnsnames.ora で使用されます。

  • IPC プロトコル エントリをリスナー記述子に追加します。

于 2014-05-27T08:58:52.853 に答える
0
 Dim oradb As String = "Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)));User Id=username;Password=password;"
 Dim conn As New OracleConnection(oradb)
 conn.Open()
于 2014-05-27T06:57:42.300 に答える