2010-05-19 71 views

回答

4

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

了一些研究之后,似乎得到它预见的关闭方式主要有两种:

  1. 在连接字符串中禁用池 - 尝试加入OLE DB Services = -2;,这应该给你所有的服务,除了汇集
  2. 尽量利用​​

对于您可能需要使用超时播放后一种方法 - 从链接的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 
} 

无论是否抛出异常,这都会关闭你的句柄。使用块将关闭/处理块末尾的资源。

+0

真的很奇怪。我实际上正在打电话给处理和关闭。 – Jonn 2010-05-19 07:49:02