我正在使用 github.com/go-sql-driver/mysql 驅動程序。我打開一個數據庫:db, err := sql.Open("mysql", str)然后我有兩個函數,每個函數使用以下 mysql 代碼調用 200 次:rows, err := db.Query("select name from beehives")if err != nil { panic(err)} defer rows.Close()第二: err = db.QueryRow("select id, secret, shortname from beehives where shortname = ?", beehive).Scan(&id, &secre switch { case err == sql.ErrNoRows: err = errors.New("Beehive '"+beehive+"' not found.") case err != nil: panic("loginBeehive: "+ err.Error()) default: // ... do the work第一個是恐慌。當我只打開一次數據庫時,怎么會有多個連接,我該如何關閉它們?
3 回答

30秒到達戰場
TA貢獻1828條經驗 獲得超6個贊
*DB
您返回的對象sql.Open
不對應于單個連接。最好將其視為數據庫的句柄:它為您管理連接池。
您可以控制打開的連接與數`(* DB).SetMaxOpenConns和其對怠速連接。
所以基本上這里發生的事情是,db.Query
并db.QueryRow
嘗試為自己獲取連接,而數據庫句柄不會對同時連接的數量施加任何限制,因此當它打開的數量超過 mysql 可以處理的數量時,您的代碼會出現恐慌。

慕田峪4524236
TA貢獻1875條經驗 獲得超5個贊
盡量讓準備好的發言db.Prepare(query string) (*Stmt, error)
和比stmt.Query
或stmt.Exec
比stmt.Close
重用連接。
- 3 回答
- 0 關注
- 301 瀏覽
添加回答
舉報
0/150
提交
取消