Ore*_*n A 11 c# idisposable resource-management idbconnection
我试图向某人解释为什么数据库连接实现IDisposable,当我意识到我真的不知道"打开连接"实际意味着什么.
所以我的问题是 - 当它打开连接时,c#几乎可以做什么?
谢谢.
Jon*_*nna 22
实际上有两个类涉及实现连接(实际上更多,但我正在简化).
其中之一是在IDbConnection
执行(SQLConnection
,NpgsqlConnection
,OracleConnection
你在你的代码中使用,等等).另一个是程序集内部的"真实"连接对象,对代码不可见.我们RealConnection
现在称之为" ",尽管它的实际名称因不同的实现而不同(例如在Npgsql中,我最熟悉的是实现,类被调用NpgsqlConnector
).
当你创建你的IDbConnection
,它没有RealConnection
.任何对数据库执行某些操作的尝试都将失败.当你Open()
它然后发生以下情况:
RealConnection
了池,并且池中有一个,则将其解除并将其设置RealConnection
为IDbConnection
.RealConnection
存在的对象总数大于最大大小,则抛出异常.RealConnection
.初始化它,这将涉及打开某种网络连接(例如TCP/IP)或文件句柄(对于像Access这样的东西),通过数据库的协议进行握手(因数据库类型而异)并授权连接.这便成为RealConnection
了IDbConnection
.在其上执行IDbConnection
的操作转变为RealConnection
在其网络连接(或其他)上执行的操作.结果转化为实现对象IDataReader
等,以便为您的编程提供一致的界面.
如果a IDataReader
是使用创建的CommandBehavior.CloseConnection
,那么该datareader将获得"所有权" RealConnection
.
当你打电话Close()
时,会发生下列情况之一:
RealConnection
将执行任何协议定义的过程以结束连接(向连接将要关闭的数据库发送信号)并关闭网络连接等.然后,对象可能超出范围并可用于垃圾回收.例外CommandBehavior.CloseConnection
情况是,如果情况发生,在这种情况下,它会被调用Close()
或触发它.Dispose()
IDataReader
如果你打电话,Dispose()
那么同样的事情发生Close()
.区别在于Dispose()
被视为"清理"并且可以使用using
,而Close()
可能在生命中期使用,之后是后续使用Open()
.
由于RealConnection
物体的使用以及它们被合并的事实,打开和关闭连接从相对较重的东西变为相对较轻的.因此,长时间保持连接打开以避免打开它们的开销是很重要的,因此尽可能短的时间保持它们的开放变得很重要,因为RealConnection
处理开销对你来说更快使用它们,池用连接在使用之间共享的效率越高.
还要注意,这没关系Dispose()
的IDbConnection
,你已经呼吁Close()
对(这是一个规则,它应该始终是安全的呼吁Dispose()
,无论状态,甚至当它已经被调用).因此,如果您手动调用Close()
它仍然可以在using
块中建立连接,以捕获在调用之前发生异常的情况Close()
.唯一的例外是你真正希望连接保持开放的地方; 假设你正在返回一个IDataReader
创建的CommandBehavior.CloseConnection
,在这种情况下你不会丢弃IDbConnection
,但会丢弃读者.
如果您未能处理连接,则不RealConnection
会将其返回池中以便重复使用,或者执行其关闭过程.池将达到其限制,或者底层连接的数量将增加到破坏性能并阻止更多创建.最终RealConnection
可能会调用终结器并导致其被修复,但最终化只会减少损坏并且不能依赖.(IDbConnection
不需要终结器,因为它RealConnection
保存非托管资源和/或需要关闭).
同样有理由认为除此之外还有一些其他的处置要求是独一无二的IDbConnection
,即使分析上述情况导致您认为没有必要,也应该将其处理掉(例外情况是CommandBehavior.CloseConnection
通过所有处置负担时)到了IDataReader
,但是那个处理那个读者同样重要.
归档时间: |
|
查看次数: |
2502 次 |
最近记录: |