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