多次调用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
}
我检查了this的答案,并使用了scan
,但仍然无法正常工作
更新
问题在另一个职能中。我在使用db.Query
时没有关闭返回的rows
对象,并反复调用了该函数。我已经更新了代码;使用了db.Exec
而不是db.Query
,它现在可以工作了。非常感谢@mkopriva的this答案。 :)
答案 0 :(得分:0)
https://golang.org/pkg/database/sql/#Open-
Open可能只验证其参数而没有创建与 数据库。
sql软件包自动创建并释放连接;它也是 维护空闲连接的空闲池。如果数据库有一个 每个连接状态的概念,可以可靠地观察到这种状态 在事务(Tx)或连接(Conn)中。一旦DB.Begin是 调用时,返回的Tx绑定到单个连接。一旦提交 或在交易中调用回滚,该交易的 连接返回到数据库的空闲连接池。泳池大小可以 由SetMaxIdleConns控制。
尝试设置https://godoc.org/database/sql#DB.SetMaxOpenConns
阅读http://go-database-sql.org/surprises.html
也很好我找不到您将dbConn
注入GetMessages(...)
的情况。
db
在哪里?
应该是这样的:
run(dbCon *sql.DB)
...
GetMessages(dbCon *sql.DB)