среда, 8 сентября 2021 г.

Управление подключениями к базе данных с пакетом database/sql в Golang

Для подавляющего большинства программ вам не нужно настраивать параметры пула соединений sql.DB по умолчанию. Но для некоторых продвинутых программ вам может потребоваться настроить параметры пула соединений или явно работать с соединениями. В этом посте объясняется, как это сделать.

Дескриптор базы данных sql.DB безопасен для одновременного использования несколькими горутинами (это означает, что дескриптор - это то, что другие языки могут назвать "потокобезопасным"). Некоторые другие библиотеки доступа к базе данных основаны на соединениях, которые могут использоваться только для одной операции за раз. Чтобы восполнить этот пробел, каждый sql.DB управляет пулом активных подключений к базе данных, создавая новые по мере необходимости для параллелизма в вашей программе Go.

Пул соединений подходит для большинства нужд доступа к данным. Когда вы вызываете метод sql.DB Query или Exec, реализация sql.DB извлекает доступное соединение из пула или, при необходимости, создает его. Пакет возвращает соединение с пулом, когда оно больше не нужно. Это поддерживает высокий уровень параллелизма для доступа к базе данных.

Настройка свойств пула соединений

Вы можете установить свойства, которые определяют, как пакет sql управляет пулом соединений. Чтобы получить статистику о влиянии этих свойств, используйте DB.Stats.

Установка максимального количества открытых подключений

DB.SetMaxOpenConns накладывает ограничение на количество открытых соединений. После этого ограничения новые операции с базой данных будут ждать завершения существующей операции, после чего sql.DB создаст другое соединение. По умолчанию sql.DB создает новое соединение каждый раз, когда используются все существующие соединения, когда соединение необходимо.

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

Установка максимального количества неактивных подключений

DB.SetMaxIdleConns изменяет ограничение на максимальное количество неактивных соединений, поддерживаемых sql.DB.

Когда операция SQL завершается с заданным подключением к базе данных, она обычно не завершается немедленно: приложение может вскоре снова потребоваться, и поддержание открытого подключения позволяет избежать повторного подключения к базе данных для следующей операции. По умолчанию sql.DB поддерживает два незанятых соединения в любой момент времени. Повышение предела позволяет избежать частых повторных подключений в программах со значительным параллелизмом.

Установка максимального количества времени, в течение которого соединение может простаивать

DB.SetConnMaxIdleTime устанавливает максимальное время простоя соединения перед его закрытием. Это приводит к тому, что sql.DB закрывает соединения, которые не использовались дольше заданного времени.

По умолчанию, когда простаивающее соединение добавляется в пул соединений, оно остается там до тех пор, пока оно не понадобится снова. При использовании DB.SetMaxIdleConns для увеличения количества разрешенных незанятых соединений во время всплесков параллельной активности, также с помощью DB.SetConnMaxIdleTime можно организовать освобождение этих соединений позже, когда система находится в состоянии покоя.

Установка максимального срока службы подключений

Использование DB.SetConnMaxLifetime устанавливает максимальное время, в течение которого соединение может оставаться открытым перед закрытием.

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

Использование выделенных соединений

Пакет database/sql включает функции, которые вы можете использовать, когда база данных может присвоить неявное значение последовательности операций, выполняемых в определенном соединении.

Наиболее распространенный пример - это транзакции, которые обычно начинаются с команды BEGIN, заканчиваются командой COMMIT или ROLLBACK и включают все команды, выдаваемые при соединении между этими командами в общей транзакции. В этом случае используйте поддержку транзакций пакета sql.

Для других случаев использования, когда последовательность отдельных операций должна выполняться в одном и том же соединении, пакет sql предоставляет выделенные соединения. DB.Conn получает выделенное соединение sql.Conn. В sql.Conn есть методы BeginTx, ExecContext, PingContext, PrepareContext, QueryContext и QueryRowContext, которые ведут себя как эквивалентные методы в БД, но используют только выделенное соединение. По завершении выделенного соединения ваш код должен освободить его с помощью Conn.Close.


Читайте также:


Купить gopher

Комментариев нет:

Отправить комментарий