Если Go sql.DB закрыто, закрытые подготовленные запросы закрываются? - PullRequest
0 голосов
/ 05 сентября 2018

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

Я сократил это до очень простого примера, который не нуждается в 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 Ответ

0 голосов
/ 05 сентября 2018

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

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

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

defer stmt.Close()

или аналогичный.

...