C# DbConnection是否在超出范围时关闭并释放?
可能重复:C# DbConnection是否在超出范围时关闭并释放?,c#,.net,ado.net,garbage-collection,dispose,C#,.net,Ado.net,Garbage Collection,Dispose,可能重复: 我的数据层中的许多函数不受try-catch或using子句的保护 我的GUI层有try-catch子句。这够了吗 如果引发异常,我是否可以依赖dbConnection和其他正在处理和关闭的对象?GUI层将处理异常 这够了吗 不可以。除了通过使用之外,不会自动处理任何内容。对象超出范围时不会被收集-gargage收集会在稍后间歇性地进行,并且是不确定的 如果要创建连接,请使用using,除非这是不可能的(例如异步回调)。否则,很容易留下大量的开放连接对象,使服务器饱和。也许可以做到
我的数据层中的许多函数不受
try-catch
或using
子句的保护
我的GUI层有try-catch
子句。这够了吗
如果引发异常,我是否可以依赖dbConnection
和其他正在处理和关闭的对象?GUI层将处理异常
这够了吗
不可以。除了通过使用
之外,不会自动处理任何内容。对象超出范围时不会被收集-gargage收集会在稍后间歇性地进行,并且是不确定的
如果要创建连接,请使用using
,除非这是不可能的(例如异步回调)。否则,很容易留下大量的开放连接对象,使服务器饱和。也许可以做到这一点,但这并不意味着这是一个好主意
一般来说,我肯定会在处理DB连接的逻辑中使用try-catch-finally
子句(或using
)。这不仅会因为您询问的原因而更安全,而且会更清楚地表明事情处理得很好,而且如果您以后决定更改GUI层中的某些内容,则会更难意外地将某些内容弄糟
您应该尽可能接近您需要的位置来处理这种类型的逻辑(以及实例的创建和处理)
注意:
Finally
子句将允许您确保连接已关闭,但如果您需要,仍然允许任何异常“冒泡”到顶部 如前所述,垃圾收集与超出范围的变量无关。至于DbConnection的close和dispose,在SqlConnection的情况下,如果调用dispose,if将关闭连接,然后对其进行处理。尽管还有其他提供者需要显式关闭然后进行处置。例如,在ODP.Net的OracleConnection中,Dispose不会关闭连接
您需要了解DbConnection是一个抽象类,当涉及到实际行为时,它完全取决于具体类。好的,那么如果我使用
使用,我还能让异常“冒泡”到GUI层进行处理吗?@CJ7是的,这将自动发生;你不需要改变任何东西来让它继续发生,而且它不会因为使用
添加而受到影响,除非有一个坏的Dispose()
实现(WCF为此而臭名昭著),它真的是个问题吗?服务器不能处理大量连接吗?当然,gargage系列会产生一个好的结果,除非你正在做一些非常奇怪的事情,比如在一个大的for
循环中打开连接。@CJ7批次?对疯狂的数量?没有。如果我在代码中保持连接打开,我估计在池饱和和系统崩溃之前还有6秒钟。请注意,这是每个节点的连接池,而不是物理sql server限制;但是为什么要将sql server暴露在不必要的负载下?不正确处理这些问题就是懒惰。