Как открыть соединение с БД только при запросе в голанге
Итак, что я собираюсь сделать, это попытаться открыть соединение с базой данных, когда есть HTTP-запрос, и снова закрыть. Я использую пакет pgx и gin, поэтому вот что я делаю:
func handleGetUsers(c *gin.Context) {
connectDB()
data, err := allUsers()
if err != nil {
log.Println(err)
return
}
results := struct {
Count int `json:"count"`
Data []User `json:"data"`
}{
Count: len(data),
Data: data,
}
c.JSON(200, results)
defer connectDB()
}
Но если я пытаюсь сделать еще один такой же HTTP-запрос, соединение с базой данных уже закрыто. Могу ли я что-то сделать или моя логика все-таки ошибалась?
1 ответ
Наверное, ваши намерения невелики.
Веб-сервер выполняет функцию Go всякий раз, когда вы запрашиваете URL-адрес своего сервера. Если это означает выполнение sql-запроса - он будет выполнен, и соединение будет закрыто. Веб-сервер возвращает результат, и связь между вашим сервером и клиентом завершена.
Что я могу посоветовать, поскольку я считаю, что вы хотите повысить производительность своего gin-gonic, так это использовать одновременное выполнение запросов к БД в Gin.
messages := make(chan string)
router.GET("/db_connection",func(c *gin.Context){
c.Copy()
go func(
connectDB()
<-messages
){}()
data, err := allUsers()
if err != nil {
log.Println(err)
return
}
results := struct {
Count int `json:"count"`
Data []User `json:"data"`
}{
Count: len(data),
Data: data,
}
c.JSON(200, results)
go func(
connectDB()
<-messages
){}()
})