强制OleDbConnection释放文件句柄

时间:2010-05-19 01:10:05

标签: .net oledb file-handling

  

Related Question

即使在我调用dispose到初始化的OleDbException之后,我的代码也没有释放文件句柄。有没有办法明确强制程序释放文件句柄?

2 个答案:

答案 0 :(得分:5)

默认情况下,.NET数据库连接使用pooling。调用Close()Dispose()只是将连接释放回池中,实际上并不强制它关闭。最终它将离开游泳池,实际上是关闭的。

经过一番研究后,似乎有两种主要方法可以预测:

  1. 禁用连接字符串中的池 - 尝试添加OLE DB Services = -2;,它应该为您提供除池之外的所有服务
  2. 尝试使用OleDBConnection.ReleaseObjectPool()
  3. 对于后一种方法,您可能需要使用超时 - 摘自链接的MSDN文章:

      

    请注意,单独调用该方法实际上并不会释放池中存在的活动连接。

         

    在最终处理池之前必须执行以下操作:

         
        
    1. 调用Close以将连接对象返回到池中。
    2.   
    3. 允许每个连接对象超出池。
    4.   
    5. 调用ReleaseObjectPool。
    6.   
    7. 调用垃圾收集。
    8.   

    我在工作中有一个用例,其中一些内部软件需要与旧的,不灵活的,片状的和绝对关键的专有软件进行交互。它需要在尽可能短的时间内打开共享的MDB数据库文件,以最小化其他软件可能“出问题”的窗口(非常糟糕)。

    我打算使用连接字符串方法,因为它看起来更容易保证关闭,而我的软件并没有真正从池中受益。

答案 1 :(得分:0)

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

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

无论是否抛出异常,都会关闭句柄。使用块将在块结束时关闭/处置资源。