"打开连接"究竟意味着什么?

Ore*_*n A 11 c# idisposable resource-management idbconnection

我试图向某人解释为什么数据库连接实现IDisposable,当我意识到我真的不知道"打开连接"实际意味着什么.
所以我的问题是 - 当它打开连接时,c#几乎可以做什么?

谢谢.

Jon*_*nna 22

实际上有两个类涉及实现连接(实际上更多,但我正在简化).

其中之一是在IDbConnection执行(SQLConnection,NpgsqlConnection,OracleConnection你在你的代码中使用,等等).另一个是程序集内部的"真实"连接对象,对代码不可见.我们RealConnection现在称之为" ",尽管它的实际名称因不同的实现而不同(例如在Npgsql中,我最熟悉的是实现,类被调用NpgsqlConnector).

当你创建你的IDbConnection,它没有RealConnection.任何对数据库执行某些操作的尝试都将失败.当你Open()它然后发生以下情况:

  1. 如果启用RealConnection了池,并且池中有一个,则将其解除并将其设置RealConnectionIDbConnection.
  2. 如果启用了池,并且RealConnection存在的对象总数大于最大大小,则抛出异常.
  3. 否则创建一个新的RealConnection.初始化它,这将涉及打开某种网络连接(例如TCP/IP)或文件句柄(对于像Access这样的东西),通过数据库的协议进行握手(因数据库类型而异)并授权连接.这便成为RealConnectionIDbConnection.

在其上执行IDbConnection的操作转变为RealConnection在其网络连接(或其他)上执行的操作.结果转化为实现对象IDataReader等,以便为您的编程提供一致的界面.

如果a IDataReader是使用创建的CommandBehavior.CloseConnection,那么该datareader将获得"所有权" RealConnection.

当你打电话Close()时,会发生下列情况之一:

  1. 如果池化,并且池未满,则将该对象放入队列以供稍后操作使用.
  2. 否则,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,但是那个处理那个读者同样重要.

  • @ RPM1984谢谢.我为Npgsql贡献了一点点,包括NpgsqlConnector如何工作,一段时间后,从中学到了很多.这是一个相对较小的组件和开源,所以看看你是否认为你会发现这个有趣的更多 (2认同)