2

我在不同的方法中使用多个连接,但是当我关闭连接时,连接会话在数据库会话中挂起为非活动状态,直到我终止 .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;

4

1 回答 1

2

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

此行为可确保您获得更好的性能,因为打开/关闭连接的成本很高。

如果您使用:

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

或者

con.Close();

这和你使用的一样Dispose();。使用只需确保在 using 块的末尾调用 Dispose。这就是为什么 using 仅适用于实现 IDisposable 的对象。

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

“最小池大小 = 0;最大池大小 = 16;增量池大小 = 2;Decr 池大小 = 1;验证连接 = False;连接生命周期 = 0;

停止这种行为。Min Pool Size 为 0 将停止自动创建新连接。

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

所以最后回答你的问题。设置MinPoolSize=0and 之后调用connection.ClearAllPools();。这应该有效。

于 2017-01-06T10:06:31.363 回答