2

我知道这应该是 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()  

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

与以前的非托管驱动程序相同的软件根本没有问题,因此它与池的大小或未处理的连接无关(正如我所说,我们可以在几乎不询问系统的情况下重现该问题)。

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

4

1 回答 1

0

不能把它放在评论中,所以就这样吧,以防有人像我一周前一样来到这里......

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

第一个工作正常,但升级到托管驱动程序后,一切都变了(没有更改任何代码)

我们已经调试了所有东西(或者至少我们是这么认为的),但没有出现任何结果,直到一位同事想出了一些关于在使用 commandbehaviour 参数调用时没有正确处理阅读器的问题。

正如我所说,我们认为我们已经对所有内容进行了双重和三重检查......但是这种读者调用是问题所在(顺便说一句,它不在我们的 DB Access 模块中,直到现在我们才看到它......组织你的代码!):

rd = cmd.ExecuteReader(CommandBehavior.CloseConnection)

当使用托管驱动程序以这种方式调用时,(似乎)阅读器不会自行关闭

只是打电话

rd.Close()   

在从读者那里检索到必要的数据之后,就成功了。

于 2019-03-04T14:30:18.673 回答