Управление соединениями

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

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

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

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

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

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

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

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

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

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, которые ведут себя аналогично соответствующим методам типа DB, но используют только выделенное подключение. По завершении работы с выделенным подключением, ваш код должен освободить его с помощью Conn.Close.

GoRu.dev Golang на русском

На сайте представлена адаптированная под русский язык документация языка программирования Golang