【问题标题】:Force an OleDbConnection to Release a File Handle强制 OleDbConnection 释放文件句柄
【发布时间】:2011-02-21 04:16:31
【问题描述】:

Related Question

即使我调用 dispose 来初始化 OleDbException,我的代码也不会释放文件句柄。有没有办法显式强制程序释放文件句柄?

【问题讨论】:

    标签: .net oledb file-handling


    【解决方案1】:

    默认情况下,.NET 数据库连接使用pooling。调用Close()Dispose() 只是将连接释放回池中,实际上并没有强制它关闭。最终它将超时,并实际上被关闭。

    经过一番研究,似乎有两种主要的方法可以预测地关闭它:

    1. 在连接字符串中禁用池 - 尝试添加 OLE DB Services = -2;,它应该会为您提供除池之外的所有服务
    2. 尝试使用OleDBConnection.ReleaseObjectPool()

    对于后一种方法,您可能需要使用超时 - 摘自链接的 MSDN 文章:

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

    在最终处置池之前必须发生以下情况:

    1. 调用 Close 将连接对象返回到池中。
    2. 允许每个连接对象超时。
    3. 调用 ReleaseObjectPool。
    4. 调用垃圾回收。

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

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

    【讨论】:

      【解决方案2】:

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

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

      无论是否抛出异常,这都会关闭您的句柄。使用块将在块的末尾关闭/释放资源。

      【讨论】:

      • 真的很奇怪。我实际上正在调用 dispose 和 close。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 2010-12-11
      相关资源
      最近更新 更多