C#WinForm Oracle会话在连接关闭后挂起



我在不同的方法中使用多个连接,但当我关闭连接时,连接会话在数据库会话中以非活动状态挂起,直到我终止.exe文件。我在使用类似于的语句时使用了连接

using(OracleConnection con = new OracleConnection(constring))
{
con.Open();
}

我还尝试手动关闭和处理连接,并使用OracleConnection。ClearPool(con)OracleConnection。ClearAllPools(),但它们都不起作用。

参考im使用:系统。数据OracleClient 2.0.0.0版本

连接字符串数据源=ip/db;用户Id=用户;密码=pw

这种行为是正常的,因为如果您Dispose();连接,Oracle的ConnectionPool不会真正破坏连接,而是将状态设置为"空闲"。因此,下次打开连接时,并不是真的打开新连接,而是在ConnectionPool中寻找一个"免费"连接并使用这个连接。如果不存在可用的连接,将创建一个新的连接。

这种行为会给你带来更好的性能,因为打开/关闭连接的成本很高。

如果您使用:

using(OracleConnection con = new OracleConnection(constring)) 
{
}

con.Close();

这与使用Dispose();相同。使用只需确保在使用块的末尾调用Dispose。这就是为什么使用仅适用于实现IDisposable的对象。

到目前为止还可以……但为什么OracleConnection.ClearAllPools()不关闭连接?确实如此,但Oracle直接创建一个新的Connection,这样您的ConnectionPool就可以填充到您的MinPool大小。这就是BigTallJosh的代码:的原因

"最小池大小=0;最大池大小=16;增量池大小=2;减量池尺寸=1;验证连接=False;连接寿命=0;

停止此行为。最小池大小为0将停止自动创建新连接。

在这里你可以找到关于ClearAllPools();方法的一个很好的解释。

最后回答你的问题。设置MinPoolSize=0,然后调用connection.ClearAllPools();。这应该行得通。

最新更新