У меня есть подключение к базе данных в моей настройке пакета администратора, как это,
Файл шаблона:
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
}
Теперь я использую это соединение в своем пакете контроллеров, например
Табличка контроллера
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()
.
Значит я немного запутался? Хорошо ли то, что я сделал, чтобы решить проблему с подключением? или есть лучший способ?
Большое спасибо.
🤔 А знаете ли вы, что...
PostgreSQL поддерживает хранимые процедуры и функции, написанные на языках, таких как PL/pgSQL.
Вам нужно просто создать одно соединение и вернуть тот же экземпляр:
type Database struct {
T *Template
}
var db *gorm.DB
func init() {
var err error
db, err = gorm.Open("postgres", "host=localhost port=5010 user=postgres dbname=postgres password=password sslmode=disable")
if err != nil {
panic(err)
}
}
func (admin *Database) DB() *gorm.DB {
return db
}