Если 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()
или похожие.