Oracle ODP.NET托管驱动程序和连接池问题

时间:2017-05-03 08:33:17

标签: oracle ado.net odp.net-managed

我知道这对Oracle来说应该是一个问题,但https://community.oracle.com中已经有四个线程问同样的问题而他们没有得到答案。也许stackoverflow中的某个人可以帮助我,因为我们遇到了托管驱动程序的大量问题。我们希望来自这个社区的人能够知道答案。

从11个非托管驱动程序迁移到12c托管驱动程序(从Nuget 4.121.2.0)后,我们的系统从Oracle获得异常。这是调用堆栈:

Oracle.ManagedDataAccess.Client.OracleException (0x80004005): Request timed out  
   bei OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch)  
   bei OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch)  
   bei OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword)  
   bei Oracle.ManagedDataAccess.Client.OracleConnection.Open()  

我们做了一些测试,似乎池没有正常工作。据我们所知,即使你保持系统运行而不做任何事情,池中的连接也会消失。当发生这种情况时,由于没有可以使用的连接,系统不能再工作了。似乎连接无效但驱动程序没有回收它们。在这种情况下,我们需要杀死进程。由于这是一个作为服务工作的业务服务器,因此这是一个主要问题。

与之前的非托管驱动程序相同的软件完全没有问题,因此它与池的大小或未处理的连接无关(正如我所说,我们可以通过几乎不查询系统来重现问题)。

你们有没有听过类似的话,可以帮助我们吗?非常感谢您的任何提示。

1 个答案:

答案 0 :(得分:0)

不能对此发表评论,所以就这样,以防万一有人像我一周前一样来到这里...

我们的问题是从Oracle.DataAccess切换到Oracle.ManagedDataAccess时。

第一个运行正常,但是升级到托管驱动程序后,一切都陷入了困境(无需更改代码中的任何内容)

我们已经调试了所有内容(或者至少我们是这样认为的),但没有结果,直到同事想出一些关于使用commandbehaviour参数调用时未正确处理的读取器的信息。

正如我所说,我们认为我们已经对它进行了双重检查和三次检查……但是这种读者调用才是问题所在(顺便说一句,它不在我们的数据库访问模块中,这避免了我们到目前为止看到它。 ...组织您的代码!):

rd = cmd.ExecuteReader(CommandBehavior.CloseConnection)

使用托管驱动程序进行这种调用时,(看来)阅读器不会自行关闭

只需致电

rd.Close()   

从读者那里获取必要的数据后,就完成了窍门。