5

我有兴趣了解数据库如何处理未由启动连接的实体明确关闭的连接。

  1. 假设我有一个一次只能接受 2 个并发连接的数据库。我有一段代码可以打开一个连接并且从不关闭它。这段代码永远运行,但它在其生命周期中只使用一次连接,但连接对象永远不会超出范围,因此它不会被垃圾收集。假设我运行此代码的 2 个实例。这是否意味着在程序终止或连接超时(由于不活动)之前,数据库不能接受更多的连接?

  2. 在上述场景中,如果连接对象被垃圾收集,那么连接是自动终止还是取决于我正在使用的数据库驱动程序,或者在我明确关闭它之前连接根本不会终止?

  3. 如果我在一段代码中打开一个连接并且我没有显式关闭连接,但程序终止了,那么数据库如何回收该连接?

4

2 回答 2

5

数据库连接的底层协议通常是基于 TCP/IP 的。可以通过以下几种方式之一终止连接:

  1. 服务器优雅地关闭它并收到来自客户端的确认;
  2. 客户端优雅地关闭并收到来自服务器的确认;
  3. 连接超时。客户端和服务器分别由各自的操作系统告知连接已关闭;
  4. 连接被任一侧强制关闭。

在 (3) 的情况下,TCP 连接必须通过每隔一段时间发送虚拟消息来保持活动状态,以避免超时。您的连接可能会超时,因为双方都没有这样做(对于数据库连接,这不是您通常想要做的事情)。

有一段时间,完全有可能一方认为连接已关闭,而另一方仍然认为它是打开的。在这些情况下可能会发送消息(通常会被丢弃)。

每个连接(“套接字”)都使用称为文件描述符的操作系统资源(在 UNIX 术语中,您的操作系统可能会称其为其他名称),它是 I/O 资源的句柄,与打开文件的句柄相同(同样,操作系统可能会有所不同)。

数据库上的连接限制将是以下各项中的最低值:

  • 操作系统的配置限制;
  • 该进程允许的最大文件描述符(减去用于 I/O 活动的任何文件描述符);和
  • (可能)有关连接限制的系统设置或策略。

如果连接不是基于 TCP 的(例如,通常在 UNIX 系统上与 MySQL 一起使用的文件系统套接字),则原理实际上非常相似。

无论如何,这个故事的寓意是数据库连接——无论其形式如何——都涉及某种操作系统资源。您的程序 hsa 直接或间接要求该资源。如果程序死了,操作系统会回收它(可能不是立即,而是最终)。如果连接被垃圾收集,那么资源将被释放,就像它被强制关闭一样。

Its that external resource (and not the code your client is using) that holds the connection open and drives any limits.

于 2009-01-16T05:50:20.580 回答
4

按顺序回答您的问题:

  1. 很可能是。除非“并发连接”实际上是指“并发查询”。如果你保持数据库连接打开,它是打开的。

  2. 垃圾收集可能会也可能不会清理连接。取决于所使用的语言和数据库驱动程序。(垃圾收集可能仅限于回收内存,而不是 TCP 连接等资源。)

  3. 当您的程序终止时,通常操作系统负责清理它使用的所有资源。这包括关闭 TCP 等连接。因此,对于大多数连接类型,数据库将被通知对方关闭了连接。

于 2009-01-16T05:49:10.627 回答