Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL连接错误(使用golang):连接太多,运行show processlist的睡眠连接太多(8000多个)_Mysql_Go - Fatal编程技术网

MySQL连接错误(使用golang):连接太多,运行show processlist的睡眠连接太多(8000多个)

MySQL连接错误(使用golang):连接太多,运行show processlist的睡眠连接太多(8000多个),mysql,go,Mysql,Go,在for循环中依次执行insert、update、query和delete 50万次,即使我将MySQL的max connection设置为10000,运行10秒后也会出现“连接太多”的情况。当运行“ShowProcessList”时,睡眠状态连接的数量会迅速增加到10000个左右。(但单独执行CURD也没问题,可以很快完成1000000次循环) 仅执行一次for循环工作正常:2017-05-16 17:10:26总成本时间5.241008ms 代码如下: func insertUnis(db

在for循环中依次执行insert、update、query和delete 50万次,即使我将MySQL的max connection设置为10000,运行10秒后也会出现“连接太多”的情况。当运行“ShowProcessList”时,睡眠状态连接的数量会迅速增加到10000个左右。(但单独执行CURD也没问题,可以很快完成1000000次循环)

仅执行一次for循环工作正常:2017-05-16 17:10:26总成本时间5.241008ms

代码如下:

func insertUnis(db *sql.DB, name string){
    stmt_insert, err := db.Prepare("insert into memDB1 values(?,?,'world.cnworld.cnworld.cnworld.cn',?,'ee02:123::af01:9231:df18:8998:ee02:123::af01:9231:df18:8998:abcd','2017070035|2703258|1943|0|0|10.121.205.248|088:abcd:e02:123::/64','Framed-Interface-Id`varchar(64)COLLATEutf8_binNOTNULLdefaultthah','varchar(64)COLLATEutf8_binNOTNULLdefault0xBF019231DF18899934hdas','Call-From-Id`varchar(32)COLLATEd',?,'Current-Bandwidt','NAS-Port-Idvarchar(256)COLLATEutf8_binNOTNULLdefaultsrunk 6/0/36:33.351 0/0/0/0/0/0NAS-Port-Idvarchar(256)COLLATEutf8_binNOTNULLdefaultsrunk 6/0/36:33.351 0/0/0/0/0/0NAS-Port-Idvarchar(256)COLLATEutf8_binNOTNULLdefaultsrunk 6/0/36:33.351 0/0/0/0/0/0sefiuhu',48204,57239,2458787490,2458787490,2458787490,'Static-Bandwidthvhar(24)','Bas-Bandwidth` varchar(64) COLLATE utf8_bin NOT NULL defaultegse','Session-Id varchar(64) COLLATE utf8_bin NOT NULL defaultlasefjie','Coa-Session-Id` varchar(64) COLLATE utf8_bin NOT NULL defaultsdf','macaddr`varchar(32) COLLATE utf8',?,65535,45656,'Reseverd1` varchar(32) COLLATE u',4294967292)")
    if err != nil {
        Log(LL_ERROR, "stmt_insert Prepare err:", err.Error(), ".")
    }
    defer stmt_insert.Close()
    stmt_update, err := db.Prepare("update memDB1 set user_name=? where session_key=?")
    if err != nil {
        Log(LL_ERROR, "stmt_update Prepare err:", err.Error(), ".")
    }   
    defer stmt_update.Close()
    stmt_del, err := db.Prepare("delete from memDB1 where session_key=?")
        if err != nil {
            Log(LL_ERROR, "stmt_del Prepare err:", err.Error(), ".")
    }
    defer stmt_del.Close() 
    for i:=0;i<500000;i++{
        session_key:=string(Krand(64,3))
        user_name := string(Krand(64,3))
        frame_ip := string(Krand(32,3))     
        Nas_IP := string(Krand(32,3))   
        nat_ip := string(Krand(32,3))   

        _, err = stmt_insert.Exec(session_key,user_name,frame_ip,Nas_IP,nat_ip)
        if err != nil {
            Log(LL_ERROR, "stmt_insert Exec err:", err.Error(), ".")
        }

        _, err = stmt_update.Exec(string(Krand(64,3)), session_key)
        if err != nil {
            Log(LL_ERROR, "stmt_update Exec err:", err.Error(), ".")
        }
        sql := "SELECT * FROM memDB1 where session_key='" + session_key+"'"
        row, err := db.Query(sql)
        defer row.Close()
        if err != nil {
            Log(LL_ERROR, "Query err:", err.Error(), ".")
        }
        _, err = stmt_del.Exec(session_key)
         if err != nil {
            Log(LL_ERROR, "stmt_del Exec err:", err.Error(), ".")
        }
    }
    common_package.WgDay.Done()
    return
}
MySQL错误消息:

2017-05-16 16:37:56 <LL_ERROR> stmt_insert Exec err:Error 1040: Too many connections. 
2017-05-16 16:37:56 <LL_ERROR> stmt_update Exec err:Error 1040: Too many connections. 
2017-05-16 16:37:56 <LL_ERROR> Query err:Error 1040: Too many connections. 2017-05-16 16:37:56 <LL_ERROR> stmt_del Exec err:Error 1040: Too many connections. 
2017-05-16 16:37:56 <LL_ERROR> stmt_insert Exec err:Error 1040: Too many connections. 
2017-05-16 16:37:56 <LL_ERROR> stmt_update Exec err:Error 1040: Too many connections 
2017-05-16 16:37:56 stmt\U插入执行错误:错误1040:连接太多。
2017-05-16 16:37:56 stmt_更新执行错误:错误1040:连接太多。
2017-05-16 16:37:56查询错误:错误1040:连接太多。2017-05-16 16:37:56执行错误:错误1040:连接太多。
2017-05-16 16:37:56 stmt_插入执行错误:错误1040:连接太多。
2017-05-16 16:37:56 stmt_更新执行错误:错误1040:连接太多
MySQL设置:
max\u connections 10050设置全局等待\u超时=30;设置全局交互_超时=30


它是一个内存表,有5个索引:
KEY index1(session\u KEY)、KEY index2(Nas IP)、KEY index3(用户名)、KEY index4(nat\u IP)、KEY index5(frame\u IP)

循环中有一个延迟,它只是将row.Close函数推到堆栈上,并在函数返回时执行。你可能想要这样的东西:

for i:=0;i<500000;i++{
    ...
    sql := "SELECT * FROM memDB1 where session_key='" + session_key+"'"
    row, err := db.Query(sql)
    if err != nil {
        Log(LL_ERROR, "Query err:", err.Error(), ".")
        continue
    }
    row.Close()
    ...
}

i:=0的
;MySQL的ierr消息:2017-05-16 16:37:56 stmt_insert Exec err:Error 1040:连接太多。2017-05-16 16:37:56 stmt_更新执行错误:错误1040:连接太多。2017-05-16 16:37:56查询错误:错误1040:连接太多。2017-05-16 16:37:56执行错误:错误1040:连接太多。2017-05-16 16:37:56 stmt_插入执行错误:错误1040:连接太多。2017-05-16 16:37:56 stmt_update Exec err:Error 1040:连接太多MySQL设置:max_connections 10050 set global wait_timeout=30;设置全局交互_超时=30;它是一个内存表,有5个索引:KEY
index1
session\u KEY
),KEY
index2
Nas IP
),KEY
index3
user\u name
),KEY
index4
nat IP
),KEY
index5
frame\IP
)不要在注释中添加更多信息,尤其是code。编辑您的问题并在末尾添加信息。尝试显式关闭循环末尾的
,在循环内调用
延迟
不会调用循环末尾的延迟函数,但当外部函数终止时会调用延迟函数。同样非常感谢peterSO@peterSO,您非常友好地帮助我编辑了这里第一个问题的格式
for i:=0;i<500000;i++{
    ...
    sql := "SELECT * FROM memDB1 where session_key='" + session_key+"'"
    row, err := db.Query(sql)
    if err != nil {
        Log(LL_ERROR, "Query err:", err.Error(), ".")
        continue
    }
    row.Close()
    ...
}