Goroutine открывает новое соединение с базой данных после каждого запроса (sqlx) и тикера - PullRequest
0 голосов
/ 08 ноября 2019

Давайте рассмотрим следующую процедуру:

func main(){
    ...
    go dbGoRoutine()
    ...
}

И функцию:

func dbGoRoutine() {
    db, err := sqlx.Connect("postgres", GetPSQLInfo())
    if err != nil {
        panic(err)
    }
    defer db.Close()

    ticker := time.NewTicker(10 * time.Second)
    for _ = range ticker.C {
        _, err := db.Queryx("SELECT * FROM table")
        if err != nil {
            // handle
        }
    }
}

Каждый раз, когда функция повторяется в тикере, она открывает соединение с CloudSQL

[service... cloudsql-proxy] 2019/11/08 17:05:05 New connection for "location:exemple-db"

Я не могу понять, почему он каждый раз открывает новое соединение, поскольку sqlx.Connect не находится в цикле for.

1 Ответ

1 голос
/ 09 ноября 2019

Эта проблема связана с тем, как функция Query в пакете sql возвращает строку:

Строка является результатом запроса. Его курсор начинается перед первой строкой набора результатов.

Эти курсоры сохраняются с использованием кэша.

попробуйте использовать Exec () .

...