我以不同的方法使用多个连接,但是当我关闭连接时,连接 session 在数据库 session 中挂起为非事件状态,直到我终止 .exe 文件。我在 using 语句中使用连接,例如:
using(OracleConnection con = new OracleConnection(constring))
{
con.Open();
}
我还尝试手动关闭和处置连接并使用 OracleConnection.ClearPool(con) 和 OracleConnection.ClearAllPools() 但它们都不起作用。
我使用的引用: System.Data.OracleClient 版本 2.0.0.0
连接字符串 数据源=ip/db;用户ID=用户;密码=pw;
最佳答案
此行为是正常的,因为如果您 Dispose();
连接,Oracle 的 ConnectionPool 不会真正销毁该连接,而是将状态设置为“空闲”。因此,下次打开连接时,您并没有真正打开新连接,您只是在连接池中查找“空闲”连接并使用它。如果不存在空闲连接,则会创建一个新连接。
此行为可以为您提供更好的性能,因为打开/关闭连接的成本很高。
如果您使用:
using(OracleConnection con = new OracleConnection(constring))
{
}
或
con.Close();
这与您使用Dispose();
相同。使用时只需确保在 using block 的末尾调用 Dispose 即可。这就是为什么 using 仅适用于实现 IDisposable 的对象。
到目前为止一切正常...但是为什么OracleConnection.ClearAllPools()
不关闭连接?它确实如此,但 Oracle 直接创建一个新连接,以便您的 ConnectionPool 填满您的 MinPool-Size。这就是 BigTallJosh 的代码的原因:
"Min Pool Size = 0; Max Pool Size = 16; Incr Pool Size = 2; Decr Pool Size = 1; Validate Connection = False; Connection Lifetime = 0;
停止这种行为。最小池大小为 0 将停止自动创建新连接。
Here您可以找到有关 ClearAllPools();
方法的很好的解释。
所以终于回答你的问题了。设置 MinPoolSize=0
,然后调用 connection.ClearAllPools();
。这应该可行。
关于C# WinForm Oracle session 在连接关闭后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41502489/