客户偶尔推送一些数据到我们写的api中,数据并发很小,但是经常会反应很慢,一个简单的查询,需要20多秒,通过抓包工具
排查,连接前,很主动推送一些select 1,这样的语句,一直重复推送,但是c#一直获取不到数据,要过20秒左右,才会发送新的请求包.
后来查询npgsql的官方网站
Connection Idle Lifetime The time (in seconds) to wait before closing idle connections in the pool if the count of all connections exceeds Minimum Pool Size. Introduced in 3.1.
我看我的npgsql的版本,还是2.x版本,升级到3.1+之后正常
原因分析:
因为npgsql默认开启连接池
技术,一直保持与数据库的连接,数据库一直出入wait的状态,过了一定时间,如20分钟,还没有新的连接,就会进入sleep或者断开状态,但是iis进程并不知道,再次请求后,iis的连接池,其实已经连不上数据库了.所以不断发送selelct 1这样的语句,测试是否可连,但是一直得不到相应,过了10几秒后,系统才会重连,这样就导致了系统缓慢,npgsql3.1之后,系统设置了默认的Connection Idle Lifetime,如果300秒iis没有新请求,会主动关闭连接池.