У меня есть соединение с базой данных в настройках пакета администратора, например,
Файл шаблона:
type Template struct{}
func NewAdmin() *Template {
return &Template{}
}
Файл базы данных:
type Database struct {
T *Template
}
func (admin *Database) DB() *gorm.DB {
db, err := gorm.Open("postgres", "host=localhost port=5010 user=postgres dbname=postgres password=password sslmode=disable")
if err != nil {
panic(err)
}
return db
}
Теперь я использую этосоединение в моем пакете контроллеров, вот так
Teamplate Controller
type Template struct {
Connection *admin.Database
}
Файл профиля:
type ProfilesController struct {
T *Template
}
func (c *ProfilesController) ProfileList(ec echo.Context) error {
profile := []models.Profile{}
c.T.Connection.DB().Find(&profile)
if len(profile) <= 0 {
reply := map[string]string{"Message": "No Profiles Found", "Code": "204"}
return ec.JSON(http.StatusBadRequest, reply)
}
return ec.JSON(http.StatusOK, profile)
}
Теперь все работало нормально, но теперь я перехожу кпостроение интерфейса к этому API.Я получаю pq: sorry, too many clients already
после примерно 96 запросов.
Так что я запустил его через почтальона и получил тот же результат.Это то, что я сделал, чтобы исправить проблему:
db := *c.T.Connection.DB()
db.Find(&profile)
defer db.Close()
Теперь, похоже, работает, я отправил более 500 запросов, хотя с почтальоном, и он работал нормально.Я гость, это db.Close()
, который помогает там.
Но я читал, что соединение является пулом, поэтому должен ли оригинальный код не работать без необходимости закрытия соединения?Я думал, что свободные соединения были выпущены системой по этому, было сделано с ними?Я также читал, что из-за того, что он является пулом, он не годится для использования db.Close()
.
Так что я немного запутался?Что я сделал, чтобы исправить проблему с подключением?или есть лучший способ?
Большое спасибо.