强制释放OleDbConnection的文件句柄

3

相关问题

即使我调用dispose方法释放了已初始化的OleDbException,我的代码仍然没有释放文件句柄。有没有办法明确强制程序释放文件句柄?

2个回答

9
默认情况下,.NET数据库连接使用池化。调用Close()Dispose()只是将连接释放回池中,而不是强制关闭它。最终它会超时并从池中关闭。
经过一番研究,似乎有两种主要方法可以可预测地使其关闭:
  1. 在连接字符串中禁用池化 - 尝试添加OLE DB Services = -2;,这应该为您提供除了池化之外的所有服务
  2. 尝试利用OleDBConnection.ReleaseObjectPool()
对于后一种方法,您可能需要调整超时时间 - 引用自链接的MSDN文章:
请注意,仅调用该方法并不会实际释放池中存在的活动连接。
在池最终被处理之前,必须执行以下操作:
1. 调用Close将连接对象返回到池中。 2. 允许每个连接对象从池中超时。 3. 调用ReleaseObjectPool。 4. 调用垃圾回收。
我在工作中有一个使用案例,需要与一些老旧、不灵活、易出故障且非常关键的专有软件交互。它需要尽可能短的时间打开共享的MDB数据库文件,以最小化其他软件可能会“有问题”的窗口期(非常糟糕)。
我计划使用连接字符串方法,因为它看起来更简单,可以保证关闭,并且我的软件并没有真正从池中受益。

0

不确定为什么您的代码在调用Dispose()后没有关闭句柄,因为它在幕后调用Close(),但以下内容可能会帮助您以常见的方式编写代码:

using (OleDbConnection conn = new OleDbConnection(connString))
{
    //your stuff here
    conn.Close();  //not necessary, but doesn't hurt
}

无论是否抛出异常,此操作将关闭您的句柄。使用代码块将在块结束时关闭/释放资源。

非常奇怪。我实际上正在调用dispose和close两个方法。 - Jonn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接