Основной протокол для соединений с базой данных обычно основан на TCP / IP. Соединение может быть разорвано одним из нескольких способов:
- Сервер изящно закрывает его и получает подтверждение от клиента;
- Клиент изящно закрывается и получает подтверждение от сервера;
- Время ожидания истекло. Как клиент, так и сервер по отдельности сообщают в соответствующих операционных системах, что соединение закрыто;
- Соединение принудительно закрыто с обеих сторон.
В случае (3) TCP-соединения должны поддерживаться в рабочем состоянии, отправляя фиктивные сообщения так часто, чтобы избежать тайм-аута. Ваше соединение может быть прервано по тайм-ауту, потому что ни одна из сторон не делает этого (а для соединения с базой данных это обычно не то, что вы обычно хотите).
Одно время вполне возможно, что одна сторона думает, что соединение закрыто, а другая сторона все еще верит, что оно открыто. Сообщения могут быть отправлены в этих случаях (и обычно отбрасываются).
Каждое соединение («сокет») использует ресурс операционной системы, называемый дескриптором файла (на языке UNIX ваша ОС может называть это как-то иначе), который является дескриптором ресурса ввода-вывода и то же самое, что и для открытого файла (опять же, ОС могут отличаться).
Ограничение на количество соединений в вашей базе данных будет самым низким из:
- Настроенный лимит для ОС;
- Максимальные файловые дескрипторы, разрешенные для этого процесса (за вычетом любых, используемых для операций ввода-вывода); и
- (возможно) системные настройки или политики по ограничениям подключения.
Если соединение не основано на TCP (например, сокет файловой системы, который часто используется с MySQL в системах UNIX), принципы на самом деле очень просты.
В любом случае, мораль этой истории заключается в том, что соединение с базой данных - независимо от его формы - включает в себя некоторый ресурс операционной системы. Ваша программа прямо или косвенно запросила этот ресурс. Если программа умрет, операционная система восстановит ее (возможно, не сразу, но в конце концов). Если соединение получает сборщик мусора, ресурс будет освобожден почти так же, как если бы он был принудительно закрыт.
Это тот внешний ресурс (а не код, который использует ваш клиент), который удерживает соединение открытым и устанавливает любые ограничения.