我将 Oracle12c 与用 C# 编写的应用程序一起使用,并使用 Oracle.ManagedDataAccess.dll 来处理数据库连接。
我们已经开始运行多年的产品偶尔会抛出此异常:
Oracle.ManagedDataAccess.Client.OracleException (0xFFFFFC0C): Pooled connection request timed out
at OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch)
at OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword, Boolean bGetForApp, String affinityInstanceName, Boolean bForceMatch)
at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword)
at Oracle.ManagedDataAccess.Client.OracleConnection.Open()
我知道这个错误的原因。查看代码,OracleConnection 或 OracleCommand 对象都没有被释放。所以这些连接正在建立,直到它最终抛出这个异常。
修复很简单。将这些包装在Using
语句中。我不需要帮助。
但是我感兴趣的是为什么这个问题现在已经开始了。该软件运行多年没有问题。他们做了一些数据库维护,更新了同一台服务器上的其他软件,然后这个问题就开始了。我不知道他们做了什么 Db 维护。
应用程序中的连接字符串没有指定任何池属性。
是否有 oracle db 设置会导致数据库中的同时连接数量减少,从而导致这种情况开始发生?
更新
我写了一个小测试应用程序来检查限制。它只是循环并打开一个连接,执行一个基本查询并且不处理连接。在我的测试系统上,它在 640 次循环后开始抛出此异常。每次我运行它时,它都会改变 10 个循环。
是什么设置了这个限制?