Vb.net SocketException首次将OracleConnection.Open与完全托管的Oracle数据提供程序一起使用
使用Oracle.ManagedDataAccess.Client,以下VB.NET行引发内部异常: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
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协议条目添加到侦听器描述符