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 ファイルを見ると、異常はないようです。