Postgresql 对不起,已经有太多客户了

Postgresql 对不起,已经有太多客户了,postgresql,go,Postgresql,Go,我收到pq:抱歉,当我多次调用GetMessages()时,已经有太多客户端出现了错误 请查找更新的代码: main()code func main() { dbConn, err := InitDB() if err != nil { Log.Error("Connection Error: ", err.Error()) return } defer dbConn.Close() go run() var input string fmt.Scan

我收到
pq:抱歉,当我多次调用
GetMessages()
时,已经有太多客户端出现了错误

请查找更新的代码:

main()
code

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
}
我检查了答案,并使用了
扫描
,但仍然不起作用

更新


问题是在另一个功能中。我使用的是
db.Query
,没有关闭返回的
对象,并且反复调用该函数。我已经更新了我的代码;使用了
db.Exec
而不是
db.Query
,它现在可以工作了。非常感谢您的回答。:)

我觉得你的
GetMessages
代码很好。您在何处执行连接代码?执行了多少次?我只从另一个函数调用了一次连接
db
*sql.db
类型的全局变量。。。尽管与问题无关,
其中id=1
表明您正在选择一行,如果是这种情况,我建议您使用
db.QueryRow
而不是
db.Query
。()检查postgres服务器的
max_connection
设置。()还可以使用pg_stat_活动中的
SELECT COUNT(*)检查现有连接的数量和/或尝试使用
SELECT*FROM pg_stat_activity检查连接在你的go应用程序执行期间。我想知道连接的完整功能是什么样子的。因为你有一个延迟连接在它里面,所以如果这个函数返回,你的连接就会被关闭,但是如果它没有返回,我想知道它是否会在某个地方的循环中打开越来越多的连接