Gorm с Postgres слишком много проблем с клиентами - PullRequest
0 голосов
/ 27 января 2019

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

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

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().

Так что я немного запутался?Что я сделал, чтобы исправить проблему с подключением?или есть лучший способ?

Большое спасибо.

1 Ответ

0 голосов
/ 27 января 2019

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

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
}
...