Перейти к содержимому
11 / 15

database/sql: пул соединений и его настройка

sql.DB — не соединение, а пул: его создают один раз при старте и передают по приложению, а sql.Open не открывает соединений вовсе и не проверяет доступность базы — для проверки есть PingContext. Настраивают пул четырьмя методами, и умолчания у них опасны. SetMaxOpenConns не ограничен по умолчанию, поэтому под нагрузкой приложение открывает столько соединений, сколько успеет, и упирается в лимит базы — обычно это и есть первая авария. SetMaxIdleConns равен двум: при большем числе открытых соединения постоянно закрываются и открываются заново, что заметно на задержке. SetConnMaxLifetime ограничивает возраст — нужен, чтобы соединения переезжали при смене мастера и не жили дольше таймаута балансировщика. SetConnMaxIdleTime убирает простаивающие. Практическое правило: MaxOpenConns считают от лимита базы, делённого на число реплик, MaxIdleConns ставят равным ему, а время жизни — меньше любого таймаута на пути.

database/sql: пул соединений и его настройка | JScriptiser