mysql采用连接池处理。
我使用工具压力在服务器上测并发,连接池大小设为1000,并发1200。
并用get_reused_time查看连接复用情况。
发现resued的次数都是0,超过1000的连接,日志显示mysql connect timeout,连接不会复用,且会限制超过连接池大小的连接,
单次的请求,是可以看到reused的值会增加
我的mysql 处理如下
local db, err = mysql:new()
if not db then
ngx.log(ngx.ERR,"new mysql error : ", err)
end
db:set_timeout(30000)
local res, err, errno, sqlstate = db:connect(mysql_props_dnps)
if not res then
ngx.log(ngx.ERR,"connect to mysql error : ", err, " , errno : ", errno, " , sqlstate : ", sqlstate)
db:close()
end
function close_db(db)
if not db then
return
end
local pool_max_idle_time = 20000 --ms
local pool_size = 1000 --connections
local ok, err = db:set_keepalive(pool_max_idle_time, pool_size)
if not ok then
ngx.log(ngx.ERR,"set keepalive error : ", err)
end
end
当我把set_keepalive注释掉,改为db:close()
我的并发1200都可以成功。
说明set_keepalive 的连接池的数量限制是生效了的。
是因为我短时间内大量并发,导致连接复用失败?