我正在做这样的事情:
import(
"database/sql"
"github.com/go-sql-driver/mysql"
)
var db *sql.DB
func main() {
var err error
db, err = sql.Open(...)
if err != nil {
panic(err)
}
for j := 0; j < 8000; j++ {
_, err := db.Query("QUERY...")
if err != nil {
logger.Println("Error " + err.Error())
return
}
}
}它适用于前150个查询(为此,我使用另一个函数进行),但在这之后,我得到了错误:
mysqli_real_connect(): (HY000/1040): Too many connections所以很明显我做错了什么,但我找不到是什么。我不知道如何为每个查询打开和关闭新连接。
Error in the log file :
"reg: 2020/06/28 03:35:34 Errores Error 1040: Too many connections"
(it is printed only once)
Error in mysql php my admin:
"mysqli_real_connect(): (HY000/1040): Too many connections"
"La conexión para controluser, como está definida en su configuración, fracasó."
(translated: "the connection for controluser, as it is defined in ti's configuration , failed.")
"mysqli_real_connect(): (08004/1040): Too many connections"发布于 2020-06-29 03:23:49
每次调用Query()时,都会创建一个新的数据库句柄。每个活动句柄都需要一个唯一的数据库连接。由于您没有调用Close,因此处理程序和连接将一直保持打开状态,直到程序退出。
在完成每个查询后调用rows.Close()来解决您的问题:
for j := 0; j < 8000; j++ {
rows, err := db.Query("QUERY...")
if err != nil {
logger.Println("Error " + err.Error())
return
}
// Your main logic here
rows.Close()
}此Close()调用通常在defer语句中调用,但这排除了for循环的使用(因为defer仅在then函数返回时执行),因此您可能希望将主逻辑转移到新函数:
for j := 0; j < 8000; j++ {
doStuff()
}
// later
func doStuff() {
rows, err := db.Query("QUERY...")
if err != nil {
logger.Println("Error " + err.Error())
return
}
defer rows.Close()
// Your main logic here
}https://stackoverflow.com/questions/62626544
复制相似问题