2009-01-16 105 views
5

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

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

  2. 在上面的场景中,如果连接对象是垃圾回收,那么连接是否会自动终止,还是依赖于我正在使用的数据库驱动程序,或者直到我明确关闭连接才终止连接?

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

回答

4

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

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

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

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

每个连接(“套接字”)使用操作系统资源,称为文件描述符(用UNIX的说法,您的操作系统可能会调用它),它是I/O资源的句柄和相同的东西用于打开文件(同样,操作系统可能会有所不同)。

上的数据库连接上的限制将是最低的:对于OS

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

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

无论如何,故事的寓意在于数据库连接 - 无论其形式如何 - 都涉及某种操作系统资源。您的程序hsa直接或间接要求提供该资源。如果程序死亡,操作系统将回收它(可能不是立即但最终)。如果连接被垃圾收集,那么资源将以与被强制关闭相同的方式被释放。

它的外部资源(而不是客户端使用的代码)将持续打开并驱动任何限制。

4

回答您的问题依次是:

  1. 是的,也许。除非通过“并发连接”,否则实际上是指“并发查询”。如果你打开数据库连接,它是打开的。

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

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