数据库和连接

时间:2009-01-16 05:40:26

标签: database database-connection

我很想知道数据库如何处理未启动连接的实体明确关闭的连接。

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

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

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

2 个答案:

答案 0 :(得分:4)

按顺序回答您的问题:

  1. 是的,可能。除非“并发连接”,否则实际上意味着“并发查询”。如果你打开数据库连接,它就会打开。

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

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

答案 1 :(得分:4)

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

  1. 服务器正常关闭它并收到客户的确认;
  2. 客户端正常关闭,并从服务器收到确认;
  3. 连接超时。客户端和服务器分别由各自的操作系统告知连接已关闭;
  4. 任何一方都强行关闭连接。
  5. 在(3)的情况下,必须通过频繁发送虚拟消息来保持TCP连接,以避免超时。您的连接可能会超时,因为双方都没有这样做(对于数据库连接,这不是您通常想要做的事情)。

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

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

    数据库连接的限制将是最低的:

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

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

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

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