数据库连接的底层协议通常是基于 TCP/IP 的。可以通过以下几种方式之一终止连接:
- 服务器优雅地关闭它并收到来自客户端的确认;
- 客户端优雅地关闭并收到来自服务器的确认;
- 连接超时。客户端和服务器分别由各自的操作系统告知连接已关闭;
- 连接被任一侧强制关闭。
在 (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.