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

标签 c# winforms session oracle10g system.data.oracleclient

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

最佳答案

此行为是正常的,因为如果您 Dispose(); 连接,Oracle 的 ConnectionPool 不会真正销毁该连接,而是将状态设置为“空闲”。因此,下次打开连接时,您并没有真正打开新连接,您只是在连接池中查找“空闲”连接并使用它。如果不存在空闲连接,则会创建一个新连接。

此行为可以为您提供更好的性能,因为打开/关闭连接的成本很高。

如果您使用:

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

con.Close();

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

关于C# WinForm Oracle session 在连接关闭后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41502489/

相关文章:

C# ListView 垂直滚动

c# - 串口通讯写入

c# - 如何实现用于在组件创建页面中填充列表的 Data Extender?

c# - 响应多个 KeyDown 事件

c# - Winforms ShowDialog(this) 屏蔽其他应用程序窗口切换到前台

java - 将 JSP Session 转换为 ArrayList<MyClass> 错误,每个代码都已更改

c# - 为什么我的动态值字典迭代(并行)丢弃了我的本地范围变量?

c# - 如何将 Windows 窗体浏览器控件的文档对象转换为 mshtml.IHTMLDocument2

php - PayPal IPN 甚至从 PayPal Simulator 失败

asp.net - 从 Windbg 中的 ASP.net 3.5 进程转储中检索 session 内容