Вопрос

Мне интересно узнать, как базы данных обрабатывают соединения, которые явно не закрыты объектом, инициировавшим соединение.

  1. Допустим, у меня есть база данных, которая может принимать только 2 одновременных подключения одновременно.У меня есть фрагмент кода, который открывает соединение и никогда не закрывает его.Этот фрагмент кода выполняется вечно, но он использует соединение только один раз за все время своего существования, но объект connection никогда не выходит за пределы области видимости, поэтому он не собирается как мусор.Допустим, я запускаю 2 экземпляра этого кода.Означает ли это, что до тех пор, пока программа не будет завершена или время ожидания соединения не истечет (из-за неактивности), база данных больше не сможет принимать подключения?

  2. В приведенном выше сценарии, если объект connection является собранным мусором, то прекращается ли соединение автоматически или это зависит от используемого мной драйвера базы данных, или соединение вообще не прерывается, пока я не закрою его явно?

  3. Если я открываю соединение в фрагменте кода и не закрываю соединение явно, но программа завершает работу, то как база данных восстанавливает это соединение?

Это было полезно?

Решение

Базовый протокол для соединений с базой данных обычно основан на TCP / IP.Соединение может быть прервано одним из нескольких способов:

  1. Сервер корректно закрывает его и получает подтверждение от клиента;
  2. Клиент завершает работу корректно и получает подтверждение от сервера;
  3. Время ожидания соединения истекло.Клиент и сервер по отдельности получают сообщение от своих соответствующих операционных систем о том, что соединение было закрыто;
  4. Соединение принудительно закрывается с обеих сторон.

В случае (3) TCP-соединения должны поддерживаться в рабочем состоянии путем периодической отправки фиктивных сообщений, чтобы избежать таймаута.Ваше соединение может прерваться, потому что ни одна из сторон этого не делает (а для подключения к базе данных это не то, что вы обычно хотите делать).

Вполне возможно, что какое-то время одна сторона будет думать, что соединение закрыто, а другая сторона все еще будет верить, что оно открыто.В таких случаях сообщения могут быть отправлены (и, как правило, отброшены).

Каждое соединение ("сокет") использует ресурс операционной системы, называемый дескриптор файла (на языке UNIX ваша операционная система может называть это как-то по-другому), который является дескриптором ресурса ввода-вывода и тем же самым, что используется для открытого файла (опять же, операционные системы могут отличаться).

Ограничение на подключения к вашей базе данных будет самым низким из:

  • Настроенный лимит для операционной системы;
  • Максимальное количество файловых дескрипторов, разрешенных для этого процесса (за вычетом любых используемых для операций ввода-вывода);и
  • (возможно) системные настройки или политики в отношении ограничений подключения.

Если соединение не основано на TCP (например, сокет файловой системы, как это часто используется с MySQL в системах UNIX), принципы на самом деле очень просты.

В любом случае, мораль этой истории такова, что подключение к базе данных - независимо от его формы - связано с каким-либо ресурсом операционной системы.Ваша программа hsa прямо или косвенно запросила этот ресурс.Если программа умрет, операционная система восстановит ее (возможно, не сразу, но со временем).Если при соединении будет собран мусор, то ресурс будет освобожден почти таким же образом, как если бы он был принудительно закрыт.

Это тот внешний ресурс (а не код, который использует ваш клиент), который поддерживает соединение открытым и устанавливает какие-либо ограничения.

Другие советы

Чтобы ответить на ваши вопросы по порядку:

<Ол>
  • Да, наверное. Если только & Quot; одновременные соединения & Quot; Вы на самом деле имеете в виду " одновременные запросы " ;. Если вы держите соединение с базой данных открытым, оно открыто.

  • Сборка мусора может или не может очистить соединение. Зависит от языка и используемого драйвера базы данных. (Сборка мусора может быть ограничена восстановлением памяти, а не ресурсами, такими как TCP-соединения.)

  • Когда ваша программа завершает работу, обычно ОС отвечает за очистку всех используемых ресурсов. Это включает в себя закрытие TCP и др. Соединений. Таким образом, для большинства типов соединений база данных будет уведомлена о том, что другая сторона закрыла соединение.

  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top