我有兴趣知道数据库如何处理未启动连接的实体明确关闭的连接.
假设我有一个一次只能接受2个并发连接的数据库.我有一段代码打开一个连接,永远不会关闭它.这段代码永远运行,但它在生命周期中仅使用一次连接,但连接对象永远不会超出范围,因此不会进行垃圾回收.假设我运行此代码的2个实例.是否意味着在程序终止或连接超时(由于不活动)之前,数据库不能再接受连接?
在上面的场景中,如果连接对象是垃圾收集的,那么连接是自动终止还是依赖于我正在使用的数据库驱动程序,或者在我明确关闭连接之前连接没有终止?
如果我在一段代码中打开一个连接并且我没有显式关闭连接,但程序终止,那么数据库如何回收该连接?
cletus.. 5
数据库连接的基础协议通常基于TCP / IP。可以通过以下几种方式之一终止连接:
服务器正常关闭它,并从客户端收到确认。
客户端正常关闭并从服务器收到确认;
连接超时。客户端和服务器分别通过各自的操作系统告知连接已关闭。
两侧的连接均被强制关闭。
在(3)的情况下,必须经常发送虚假消息来保持TCP连接的活动,以避免超时。您的连接可能会超时,因为双方都没有这样做(对于数据库连接,这通常不是您想要执行的操作)。
一侧完全有可能有一段时间认为连接已关闭,而另一侧仍然认为连接已打开。在这种情况下,可能会发送消息(并且通常将其丢弃)。
每个连接(“套接字”)都使用称为文件描述符的操作系统资源(在UNIX中,您的OS可能将其称为其他名称),它是I / O资源的句柄,并且与用于打开文件的内容相同(再次,操作系统可能会有所不同)。
数据库上的连接限制将是最低的:
操作系统的配置限制;
该进程允许的最大文件描述符(减去用于I / O活动的文件描述符);和
(可能)系统设置或有关连接限制的策略。
如果连接不是基于TCP的(例如,在UNIX系统上通常与MySQL一起使用的文件系统套接字),则原理实际上是非常相似的。
无论如何,这个故事的寓意在于,数据库连接(无论其形式如何)都涉及某种操作系统资源。您的程序直接或间接要求该资源。如果程序死了,操作系统将收回它(也许不是立即恢复,而是最终恢复)。如果连接被垃圾回收,则资源将被释放,就像被强制关闭一样。
保持连接打开并驱动任何限制的外部资源(而不是客户端使用的代码)。
数据库连接的基础协议通常基于TCP / IP。可以通过以下几种方式之一终止连接:
服务器正常关闭它,并从客户端收到确认。
客户端正常关闭并从服务器收到确认;
连接超时。客户端和服务器分别通过各自的操作系统告知连接已关闭。
两侧的连接均被强制关闭。
在(3)的情况下,必须经常发送虚假消息来保持TCP连接的活动,以避免超时。您的连接可能会超时,因为双方都没有这样做(对于数据库连接,这通常不是您想要执行的操作)。
一侧完全有可能有一段时间认为连接已关闭,而另一侧仍然认为连接已打开。在这种情况下,可能会发送消息(并且通常将其丢弃)。
每个连接(“套接字”)都使用称为文件描述符的操作系统资源(在UNIX中,您的OS可能将其称为其他名称),它是I / O资源的句柄,并且与用于打开文件的内容相同(再次,操作系统可能会有所不同)。
数据库上的连接限制将是最低的:
操作系统的配置限制;
该进程允许的最大文件描述符(减去用于I / O活动的文件描述符);和
(可能)系统设置或有关连接限制的策略。
如果连接不是基于TCP的(例如,在UNIX系统上通常与MySQL一起使用的文件系统套接字),则原理实际上是非常相似的。
无论如何,这个故事的寓意在于,数据库连接(无论其形式如何)都涉及某种操作系统资源。您的程序直接或间接要求该资源。如果程序死了,操作系统将收回它(也许不是立即恢复,而是最终恢复)。如果连接被垃圾回收,则资源将被释放,就像被强制关闭一样。
保持连接打开并驱动任何限制的外部资源(而不是客户端使用的代码)。