我在不同的方法中使用多个连接,但当我关闭连接时,连接会话在数据库会话中以非活动状态挂起,直到我终止.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();
。这应该行得通。