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

C# WinForm Oracle sessions hangs after connection closed

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

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

而且我还尝试手动关闭和处理连接并使用 OracleConnection.ClearPool(con)OracleConnection.ClearAllPools() 但其中 none 有效。

我使用的参考: System.Data.OracleClient 版本 2.0.0.0

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

此行为是正常的,因为如果您 Dispose(); 连接,来自 Oracle 的 ConnectionPool 不会真正破坏连接,而是将状态设置为 'free'。所以下次你打开一个连接时,你并没有真正打开一个新的连接,你只是在你的ConnectionPool中寻找一个'free'连接并使用这个。如果不存在空闲连接,将创建一个新连接。

此行为保证您获得更好的性能,因为 Open/Close 连接成本低廉。

如果您使用:

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

con.Close();

这与您使用 Dispose(); 相同。使用只需确保在 using 块的末尾调用 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();。这应该有效。