Я реализую код, в котором мне нужно выполнять несколько действий через фиксированные промежутки времени.
Некоторые из них связаны с извлечением данных из базы данных mysql.
Чтобы запланировать эти действия с фиксированным интервалом, я использую gocron. Работает неплохо.
Для базы данных на данный момент я создаю экземпляр в начале основной программы и передаю его подпрограммам. Я использую https://github.com/jmoiron/sqlx для работы с БД.
Поток кода:
i- инициализировать ресурсы. Например, db = sql.Open; поместите БД в общую структуру для передачи всем подпрограммам
ii- scheduleActions с использованием gocron (передавайте ресурсы по мере необходимости)
iii- действия - это конкретная подпрограмма, которая выполняет задачу по мере необходимости, используя данный ресурс (например, для БД)
У меня было несколько случаев, когда необходимо перезапустить службу mysql.
Затем, как и ожидалось, я получаю сообщение об ошибке недопустимого соединения. что-то вроде
[mysql] packets.go:33: unexpected EOF
[mysql] packets.go:130: write tcp 127.0.0.1:36191->127.0.0.1:3306: write: broken pipe
[mysql] connection.go:312: invalid connection
Чтобы обойти это, я сделал реализацию, чтобы получить соединение с БД в подпрограмме и закрыть с помощью defer db.close (). При этом я получаю ошибку, связанную со слишком большим количеством открытых подключений. Я проверил правильное закрытие строк, а также использование сканирования. И посмотрите, как выполняются рекомендации.
Я хотел бы понять, как работать с открытием и закрытием БД в моем случае.






Вы можете использовать sync.Once, чтобы предотвратить это:
var conn *sql.DB // Set package-wide, but not exported
var once sync.Once
func GetConnection() *sql.DB {
once.Do(func() {
var err error
if conn, err = sql.Open("postgres", "<credentials>"); err != nil {
log.Panic(err)
}
conn.SetMaxOpenConns(20) // Sane default
conn.SetMaxIdleConns(0)
conn.SetConnMaxLifetime(time.Nanosecond)
})
return conn
}
Прочтите это: https://aaronoellis.com/articles/preventing-max-connection-errors-in-go
Спасибо Алиреза. Я попробую и дам знать, сработает ли это.