“打开连接”到底是什么意思?我试图向某人解释为什么数据库连接实现IDisposable,当我意识到我真的不知道“打开连接”的实际含义时。所以我的问题是——当c#打开一个连接时,它实际上做了什么?谢谢。实际上有两个类参与实现连接(更实际,但我正在简化)。其中之一是您在代码中使用的IDbConnection实现(SQLConnection、NpgsqlConnection、OracleConnection等)。另一个是程序集中的“真实”连接对象,对代码不可见。我们现在称它为“RealConnection”,尽管它的实际名称因实现而异(例如,在Npgsql中,我最熟悉的实现,该类称为NpgsqlConnector)。创建没有RealConnection的IDbConnection。任何对数据库执行某些操作的尝试都将失败。当您打开()时,会发生以下情况:如果启用了池,并且池中存在RealConnection,则将其设为RealConnection并将其设为IDbConnection的RealConnection。如果启用池并且存在的RealConnection对象总数大于最大大小,则会抛出异常。否则创建一个新的RealConnection。初始化它,这将涉及打开某种网络连接(例如TCP/IP)或文件句柄(例如Access),使用数据库协议(因数据库类型而异)进行握手并授权连接。然后就变成了IDbConnection的RealConnection。在IDbConnection上执行的操作被转换为在RealConnection上对其网络连接(或其他方式)执行的操作。结果变成一个实现IDataReader等的对象,为您的编程提供一致的接口。如果IDataReader是使用CommandBehavior.CloseConnection创建的,则该数据读取器将获得RealConnection的“所有权”。当您调用Close()时,将发生以下情况之一:如果池化且池未满,则对象排队等待以后的操作使用。否则,RealConnection将执行任何协议定义的过程来结束连接(向数据库发出连接即将关闭的信号)、关闭网络连接等。然后该对象可能会超出范围并可用于垃圾收集。例外情况是当CommandBehavior.CloseConnection条件发生时,在这种情况下,在触发此条件的IDataReader上调用Close()或Dispose()。如果调用Dispose()然后调用Close(),也会发生同样的事情。不同之处在于Dispose()被认为是“清理”并且可以使用,而Close()可能在其生命周期的中间使用,随后是Open()。由于RealConnection对象的使用以及它们被合并的事实,打开和关闭连接从相对重量级的事情变成相对轻量级的事情。因此,保持连接长时间打开以避免打开它们的开销很重要,因此保持它们打开的时间尽可能短变得很重要,因为RealConnection会为您处理开销,并更快地使用它们,当using之间共享池化连接的效率更高。另请注意,可以Dispose()一个您已经调用Close()的IDbConnection(这是一条规则,无论状态如何,调用Dispose()都应该始终是安全的,实际上即使它已被调用)。因此,如果您手动调用Close(),最好在using块中建立连接以捕获在调用Close()之前发生的异常。唯一的例外是您确实希望连接保持打开状态;假设您要返回一个使用CommandBehavior.CloseConnection创建的IDataReader,在这种情况下您不会丢弃IDbConnection,而是丢弃读取器。如果您未能处理连接,则RealConnection将不会返回到池中以供重用,或执行其关闭过程。要么池将达到其限制,要么基础连接的数量将增长到会降低性能并阻止创建更多连接的程度。这可能最终会调用RealConnection上的RealConnection处理程序并导致它被修复,但最终确定只会减少损坏并且不能依赖。(IDbConnection不需要终结器,因为它是一个包含非托管资源和/或需要关闭的RealConnection)。假设除了这个独特的处理需求之外还有一些其他的IDbConnection实现,即使分析上面导致你认为它是不必要的,它应该被处理掉(除了CommandBehavior.CloseConnection将所有处理负担传递给IDataReader,但配置读者同样重要。好问题。从我在SQL连接的“幕后”工作(知识有限)来看,涉及许多步骤,例如:打开物理套接字/管道的幕后步骤(使用给定的驱动程序,例如ODBC)与SQLServer握手协商的连接字符串/凭据事务范围更不用说连接池了,我相信这涉及某种算法(如果连接字符串与现有池匹配,则连接是添加到池中,否则将创建一个新连接)IDiposable关于SQL连接,我们实现了IDisposable,这样当我们调用dispose(通过using指令或表达式)时,它会将连接放回连接池中。这与普通的旧sqlConnection相同。Close()形成鲜明对比-因为所做的只是暂时关闭它,但保留该连接供以后使用。据我了解,.Close()关闭与数据库的连接,而.Dispose()调用.Close(),然后释放非托管资源。牢记这些要点,最好至少实现IDisposable。添加到上面的答案......重点是当连接“打开”时,可能会分配资源,这将需要比标准垃圾收集更多的资源来恢复,即一些打开的套接字/管道/IPC。Dispose()方法清除这些。以上就是C#学习教程:“打开连接”是什么意思?分享的所有内容,如果对大家有用,还需要了解更多C#学习教程,希望大家多多关注~本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
