Если Go sql.DB закрыто, закрытые подготовленные запросы закрываются?

В программе Go, использующей database/sqlБудут ли закрытые подготовленные запросы закрыты, когда я Close Postgres DB я использую?

Я сократил это до очень простого примера, который не нуждается в Prepare но все еще показывает вопрос (я думаю, я мог бы просто передать строку запроса QueryRow и получить неявное Prepare, но оставьте это прямо здесь, чтобы я мог задать свой вопрос):

import (
    "database/sql"
)

// Store struct is the postgres
type Store struct {
    pq *sql.DB
}

type Info struct {
    ID      string `json:"id"`
    Name    string `json:"name"`
}

func (s *Store) GetInfo(id string) Info {
    defer s.pq.Close()
    stmt, err := s.pq.Prepare(`
            SELECT id, name 
            FROM info 
            WHERE id = $1 LIMIT 1
            `)
    if err != nil {
        return Info{}
    }
    var res Info
    _ = stmt.QueryRow(id).Scan(&res.ID, &res.Name)
    return res
}

1 ответ

Решение

Технически database/sql определенно ожидает, что вы закроете свои собственные подготовленные операторы, и не сделает этого за вас, когда БД или DC закрыты. Кроме того, я подумал, что сервер может очистить внутреннюю память при выходе из вашей программы, но PostgreSQL также не очистит ее...

https://github.com/lib/pq/issues/446

Если вы получаете неявное подготовить то database/sql будет выполнять очистку для вас, но это будет менее эффективно, если вы выполняете эти запросы снова и снова, поэтому я настоятельно рекомендую вам очистить после себя с помощью:

defer stmt.Close()

или похожие.

Другие вопросы по тегам