Обработка базы данных открытия и закрытия в подпрограммах - PullRequest
0 голосов
/ 25 мая 2018

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

Мало кто из них связан с извлечением данных из базы данных 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 ().При этом я получаю ошибку, связанную с слишком большим количеством открытых соединений.Я проверил правильность закрытия строк, а также использование сканирования.И посмотрите, как выполняются рекомендации.

Я хотел бы понять, как поступить с открытой и закрытой БД в моем случае.

1 Ответ

0 голосов
/ 25 мая 2018

Вы можете использовать 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

...