我知道这对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()
我们做了一些测试,似乎池没有正常工作。据我们所知,即使你保持系统运行而不做任何事情,池中的连接也会消失。当发生这种情况时,由于没有可以使用的连接,系统不能再工作了。似乎连接无效但驱动程序没有回收它们。在这种情况下,我们需要杀死进程。由于这是一个作为服务工作的业务服务器,因此这是一个主要问题。
与之前的非托管驱动程序相同的软件完全没有问题,因此它与池的大小或未处理的连接无关(正如我所说,我们可以通过几乎不查询系统来重现问题)。
你们有没有听过类似的话,可以帮助我们吗?非常感谢您的任何提示。
答案 0 :(得分:0)
不能对此发表评论,所以就这样,以防万一有人像我一周前一样来到这里...
我们的问题是从Oracle.DataAccess切换到Oracle.ManagedDataAccess时。
第一个运行正常,但是升级到托管驱动程序后,一切都陷入了困境(无需更改代码中的任何内容)
我们已经调试了所有内容(或者至少我们是这样认为的),但没有结果,直到同事想出一些关于使用commandbehaviour参数调用时未正确处理的读取器的信息。
正如我所说,我们认为我们已经对它进行了双重检查和三次检查……但是这种读者调用才是问题所在(顺便说一句,它不在我们的数据库访问模块中,这避免了我们到目前为止看到它。 ...组织您的代码!):
rd = cmd.ExecuteReader(CommandBehavior.CloseConnection)
使用托管驱动程序进行这种调用时,(看来)阅读器不会自行关闭
只需致电
rd.Close()
从读者那里获取必要的数据后,就完成了窍门。