多次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)
}
Run Code Online (Sandbox Code Playgroud)
数据库连接代码为:
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 Code Online (Sandbox Code Playgroud)
run 协程:
func run() {
for {
messages, err := GetMessages()
if err != nil {
Log.Error("Connection …Run Code Online (Sandbox Code Playgroud) 我的Web API应用程序中有一组功能。他们对Postgres数据库中的数据执行一些操作。
func CreateUser () {
db, err := sql.Open("postgres", "user=postgres password=password dbname=api_dev sslmode=disable")
// Do some db operations here
}
Run Code Online (Sandbox Code Playgroud)
我想函数应该彼此独立地与db一起工作,所以现在我sql.Open(...)在每个函数中都有了。我不知道这是管理数据库连接的正确方法。
应用启动后,是否应该在某个地方打开它,并将db作为参数传递给相应的函数,而不是在每个函数中都打开连接?
我的main函数打开一个数据库连接:
func main() {
db, err := sql.Open("sqlite3", "./house.db")
checkErr(err)
...
}
Run Code Online (Sandbox Code Playgroud)
然后,我想创建一个函数,允许我根据传递的结构向数据库添加一行:
func addRow(row Room) error {
stmt, err := db.Prepare("INSERT INTO Rooms (Name, Size, WindowCount, WallDecorationType, Floor) VALUES(?, ?, ?, ?, ?)")
_, err = stmt.Exec(row.Name , row.Size , row.WindowCount , row.WallDecorationType , row.Floor)
return err
}
Run Code Online (Sandbox Code Playgroud)
但显然我不能这样做,因为addRow()函数不知道是什么db.
我该如何使这个功能起作用?我是否应该在主要功能之外打开数据库?