База данных и соединения - PullRequest
       13

База данных и соединения

5 голосов
/ 16 января 2009

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 16 января 2009

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

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

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

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

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

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

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

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

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

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

4 голосов
/ 16 января 2009

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

  1. Да, наверное. Если под «одновременными подключениями» вы на самом деле не имеете в виду «одновременные запросы». Если вы держите соединение с базой данных открытым, оно открыто.

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

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

...