gpt4 book ai didi

c# - "opening a connection"实际上是什么意思?

转载 作者:可可西里 更新时间:2023-11-01 08:34:55 25 4
gpt4 key购买 nike

我试图向某人解释为什么 数据库连接实现 IDisposable,当我意识到我真的不知道“打开连接”实际上是什么意思时。
所以我的问题是 - c# 在打开连接时实际上做了什么?

谢谢你。

最佳答案

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

其中之一是 IDbConnection您在代码中使用的实现( SQLConnectionNpgsqlConnectionOracleConnection 等)。另一个是程序集内部的“真实”连接对象,对您的代码不可见。我们暂时将其称为“RealConnection ”,尽管其实际名称因不同的实现而异(例如,在 Npgsql 中,这是我最熟悉实现的情况,该类称为 NpgsqlConnector )。

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

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

  • IDbConnection上进行的操作都变成了运营 RealConnection在其网络连接(或其他)上执行。结果转化为实现 IDataReader 的对象等等,以便为您的编程提供一致的接口(interface)。

    如果 IDataReader是用 CommandBehavior.CloseConnection 创建的,然后该数据读取器获得 RealConnection 的“所有权” .

    当您拨打 Close()然后发生以下情况之一:
  • 如果池化,并且池未满,则对象被放入队列以供以后的操作使用。
  • 否则 RealConnection将执行任何协议(protocol)定义的过程来结束连接(向数据库发出连接将要关闭的信号)并关闭网络连接等。然后该对象可能会超出范围并可供垃圾收集。

  • 异常(exception)情况是如果 CommandBehavior.CloseConnection案例发生了,在这种情况下是 Close()Dispose()被叫到 IDataReader这触发了这个。

    如果您拨打 Dispose()然后按照 Close() 发生同样的事情.不同的是 Dispose()被视为“清理”并且可以与 using 一起使用, 而 Close()可能会在生命周期的中期使用,然后是稍后的 Open() .

    因为使用了 RealConnection对象以及它们被合并的事实,打开和关闭连接从相对较重的东西变为相对较轻的东西。因此,重要的是保持连接长时间打开以避免打开它们的开销,重要的是保持它们打开的时间尽可能短,因为 RealConnection为您处理开销,您使用它们的速度越快,池连接在使用之间共享的效率就越高。

    另请注意,可以使用 Dispose() IDbConnection您已经拨打过 Close() on(一条规则是调用 Dispose() 应该始终是安全的,无论状态如何,实际上即使它已经被调用)。因此,如果您手动拨打 Close()using 中建立连接仍然会很好阻止,以捕获在调用 Close() 之前发生异常的情况.唯一的异常(exception)是您实际上希望连接保持打开状态;假设您要返回 IDataReader创建于 CommandBehavior.CloseConnection ,在这种情况下,您不会处理 IDbConnection ,但是 处置读者。

    如果您未能处理连接,则 RealConnection不会返回到池中重复使用,也不会经过其关闭程序。要么池将达到其限制,要么底层连接的数量将增加到损害性能并阻止更多创建的程度。最终定稿在 RealConnection可能会被调用并导致此问题被修复,但最终确定只会减少损害,不能依赖。 ( IDbConnection 不需要终结器,因为它是 RealConnection 持有非托管资源和/或需要关闭)。

    还可以合理地假设,对于 IDbConnection 的实现还有其他一些独特的处置要求。除此之外,即使分析上述内容导致您认为它没有必要,它仍然应该被处理(异常(exception)是当 CommandBehavior.CloseConnection 将所有处理负担传递给 IDataReader 时,但处理它同样重要读者)。

    关于c# - "opening a connection"实际上是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3845764/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com