pq: извините, слишком много клиентов уже - PullRequest
0 голосов
/ 21 декабря 2018

Я получаю pq: sorry, too many clients already ошибку при многократном вызове GetMessages().

Пожалуйста, найдите обновленный код:

main() код

func main() {
  dbConn, err := InitDB()
  if err != nil {
    Log.Error("Connection Error: ", err.Error())
    return
  }
  defer dbConn.Close()
  go run()
  var input string
  fmt.Scanln(&input)
}

Код подключения к базе данных:

func InitDB()(*sql.DB, error) {
  connectionString := fmt.Sprintf("user=%v password='%v' dbname=%v sslmode=disable", USER, PASSWORD, DATABASE)
  db, err = sql.Open(DRIVER, connectionString)
  return db, err
}

run goroutine:

func run() {
  for {
    messages, err := GetMessages()
    if err != nil {
      Log.Error("Connection Error: ", err.Error())
      return
    }
    log.Info(messages)
  }
}

GetMessages() код функции:

func GetMessages() (messages []string, err error) {
    rows, err := db.Query(`SELECT message1, message2, message3, message4, message5,
            message6, message7, message8, message9, message10, message11, message12, message13, 
            message14, message15, message16, message17, message18, message19, message20, message21,
            message22, message23, message24, message25, message26, message27, message28, message29,
            message30, message31, message32, message33, message34, message35, message36, message37,
            message38, message39, message40, message41, message42, message43, message44, message45,
            message46, message47, message48 FROM table1 WHERE id=1`)

    if err != nil {
        Log.Error("Query error", err)
        return messages, err
    }

    var pointers []interface{}
    defer rows.Close()

    for rows.Next() {
        pointers = make([]interface{}, 48)
        messages = make([]string, 48)
        for i, _ := range pointers {
            pointers[i] = &messages[i]
        }
        err = rows.Scan(pointers...)
        if err != nil {
            Log.Error("Failed to scan row", err)
            return messages, err
        }
    }

    return messages, nil
}

Я проверил этот ответ, и я использовал scan, но все равно он не работает

ОБНОВЛЕНИЕ

Проблема была в другой функции.Я использовал db.Query, не закрывая возвращенный объект rows, и неоднократно вызывал эту функцию.Я обновил свой код;использовал db.Exec вместо db.Query и теперь работает.Большое спасибо @ mkopriva за этот ответ.:)

1 Ответ

0 голосов
/ 22 декабря 2018

https://golang.org/pkg/database/sql/#Open -

Open может просто проверить свои аргументы без создания соединения с базой данных.

Пакет sql создает и освобождает соединения автоматически;он также поддерживает свободный пул свободных соединений.Если база данных имеет концепцию состояния для каждого соединения, такое состояние можно надежно наблюдать в транзакции (Tx) или соединении (Conn).После вызова DB.Begin возвращаемый Tx привязывается к одному соединению.При вызове Commit или Rollback транзакции соединение этой транзакции возвращается в пул свободных соединений БД.Размер пула можно контролировать с помощью SetMaxIdleConns.

Попробуйте установить https://godoc.org/database/sql#DB.SetMaxOpenConns

Также полезно читать http://go -database-sql.org / surpriseises.html

Я не могу найти, если вы вводите свой dbConn в GetMessages(...).Откуда db здесь?

Должно быть что-то вроде этого:

run(dbCon *sql.DB)
...
GetMessages(dbCon *sql.DB)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...