Для подавляющего большинства программ вам не нужно настраивать параметры пула соединений 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.
Читайте также:
- Доступ к реляционной базе данных c Golang
- Работа с реляционными базами данных с Golang
- Открытие дескриптора базы данных с Golang
- Выполнение операторов SQL, которые не возвращают данные, с пакетом database/sql в Golang
- Запрос данных из базы данных с пакетом database/sql в Golang
- Использование подготовленных операторов с пакетом database/sql в Golang
- Выполнение транзакций с пакетом database/sql в Golang
- Отмена незавершенных операций с базой данных в Golang
Комментариев нет:
Отправить комментарий