DbConnection在超出范围时是否关闭并处理?

时间:2012-08-20 07:39:24

标签: c# .net ado.net garbage-collection dispose

  

可能重复:
  Close and Dispose - which to call?

我的数据层中的许多功能都不受try-catchusing条款的保护。

我的GUI图层有try-catch个子句。这还够吗?

如果引发异常,我可以依赖dbConnection和其他被处置和关闭的对象吗? GUI层将处理异常。

3 个答案:

答案 0 :(得分:8)

  

这还够吗?

没有。除了using之外,什么都不会自动处理。当对象超出范围时不会收集对象 - 后续,间歇性地进行收集,并且是非确定性的。

如果要创建连接,请使用using,除非这是不可能的(例如,异步回调)。否则你很容易就会留下很多打开的连接对象,使服务器饱和。

答案 1 :(得分:0)

也许可以可能会这样做,但这并不意味着它是个好主意。

通常,我肯定会在处理DB-Connection的逻辑周围使用try-catch-finally子句(或using)。由于你所询问的原因,这不仅会更安全,而且事情处理得更好也会更清楚,如果你决定稍后在GUI层更改某些内容,它会更难以意外地弄乱一些东西。

您应该尽可能接近您需要的逻辑(以及创建和处理实例)。

注意:Finally子句可以让您确保连接已关闭,但仍然可以将任何异常“冒泡”到顶部,如果这是您需要的。

答案 2 :(得分:0)

如前所述,垃圾收集独立于超出范围的变量。至于关闭和处理DbConnection,如果你调用Dispose,在SqlConnection的情况下,如果关闭连接然后处理它。虽然还有其他提供商需要明确关闭然后处置。例如,在ODP.Net的OracleConnection中处理不会关闭连接。

您需要了解DbConnection是一个抽象类,它在实际行为方面完全取决于具体类。