Vb.net SocketException首次将OracleConnection.Open与完全托管的Oracle数据提供程序一起使用

Vb.net SocketException首次将OracleConnection.Open与完全托管的Oracle数据提供程序一起使用,vb.net,oracle,socketexception,odp.net-managed,Vb.net,Oracle,Socketexception,Odp.net Managed,使用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

使用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()
A first chance exception of type 'System.Net.Sockets.SocketException' occurred in System.dll
conn.Open语句成功,但引发以下异常:

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()
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()
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.TCPTTransportAdapter.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(字符串tnsdesdescriptor)
Oracle.ManagedDataAccess.dll!OracleInternal.Network.OracleCommunication.Connect(字符串tnsdesdescriptor、bool externalAuth、字符串instanceName)
Oracle.ManagedDataAccess.dll!OracleInternal.ServiceObjects.OracleConnectionImpl.Connect(Oracle.ManagedDataAccess.Client.ConnectionString cs,bool-bOpenEndUserSession,字符串instanceName)
Oracle.ManagedDataAccess.dll!OracleInternal.ConnectionPool.PoolManager.CreateNewPRThreadFunc(对象状态)
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext ExecutionContext,System.Threading.ContextCallback回调,对象状态,bool preserveSyncCtx)
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext ExecutionContext,System.Threading.ContextCallback回调,对象状态,bool preserveSyncCtx)
mscorlib.dll!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch()

查看Oracle.trc文件,似乎没有什么异常。

主要问题似乎是listener.ora和tnsnames.ora配置

 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()
这是一个本地12c标准数据库服务器安装,listener.ora配置文件包含一个IPC协议条目,我在安装过程中没有要求它包含这个条目。一旦我运行网络配置助手来重新配置侦听器,这个条目就消失了。此外,TCP协议的主机名已从localhost更改为真实的计算机名

至于tnsnames.ora,网络配置助手将描述符中的主机名从localhost更新为真实的机器名,并删除了SERVER=DEDICATED值

我可以肯定,在12c数据库服务器的标准/典型安装过程中,我没有在任何时候指定localhost,但响应文件中确实包含条目“ORACLE_HOSTNAME=localhost”,因此我指定了该值,或者安装程序默认为该值

但就SocketException而言,罪魁祸首似乎是listener.ora配置文件中存在IPC协议条目

我再也看不到内部的首次SocketException和OracleConnection。打开执行时间现在减少到不到半秒,即比最初的情况少一秒

编辑

我可以确认,标准12c数据库的典型安装将

  • 默认情况下,将ORACLE_主机名设置为localhost,这将在listener.ora和tnsnames.ora中使用

  • 将IPC协议条目添加到侦听器描述符


您可以发布完整的堆栈跟踪吗?是否一致?堆栈跟踪为189KB,可能有点不适合在此处发布。有什么特别需要我找的吗?是的,行为是一致的。我希望看到实际方法失败,这样我可以在反编译后跟踪它。我添加了异常发生时看到的.NET堆栈跟踪(如果这是您所寻找的)。这里的一些解释不会出错,并导致人们不将其标记为删除。如果您(Juno)我的意思是说我在结尾遗漏了一个分号,谢谢你指出,但这本身并没有什么区别。很高兴你找到了。谢谢你以后有用的参考资料!