即使在我调用 dispose 到初始化的 OleDbException 之后,我的代码也不会释放文件句柄。有没有办法显式强制程序释放文件句柄?
问问题
2214 次
2 回答
9
默认情况下,.NET 数据库连接使用pooling。调用Close()
并将Dispose()
连接释放回池中,它实际上并没有强制它关闭。最终它将超时,并实际上被关闭。
经过一番研究,似乎有两种主要的方法可以让它以可预测的方式接近:
- 禁用连接字符串中的池-尝试添加
OLE DB Services = -2;
,它应该为您提供除池之外的所有服务 - 尝试利用
OleDBConnection.ReleaseObjectPool()
对于后一种方法,您可能需要使用超时 - 摘自链接的 MSDN 文章:
请注意,单独调用该方法实际上并不会释放池中存在的活动连接。
在最终处置池之前必须发生以下情况:
- 调用 Close 将连接对象返回到池中。
- 允许每个连接对象超时池。
- 调用 ReleaseObjectPool。
- 调用垃圾收集。
我在工作中有一个用例,其中一些内部软件需要与旧的、不灵活的、片状的和绝对关键的专有软件进行交互。它需要尽可能短的时间打开一个共享的 MDB 数据库文件,以最小化其他软件可能“出现问题”的窗口(非常糟糕的事情)。
我计划使用连接字符串方法,因为它看起来更容易保证关闭,而且我的软件并没有真正从池中受益。
于 2012-04-12T07:46:47.403 回答
0
不知道为什么您的代码在调用 Dispose() 后没有关闭句柄,因为它在后台调用 Close(),但以下内容可能会帮助您以常见的方式编写代码:
using (OleDbConnection conn = new OleDbConnection(connString))
{
//your stuff here
conn.Close(); //not necessary, but doesn't hurt
}
无论是否引发异常,这都会关闭您的句柄。使用块将在块的末尾关闭/处置资源。
于 2010-05-19T04:07:56.230 回答