Gorm с Postgres Слишком много клиентских проблем

У меня есть подключение к базе данных в моей настройке пакета администратора, как это,

Файл шаблона:

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.


1
1 454
1

Ответ:

Решено

Вам нужно просто создать одно соединение и вернуть тот же экземпляр:

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
}