@wenshao @kimmking 生产环境 应用配置的maxActive是50,但是通过netstat 查看到的数据库连接数有700+,比maxActive大很多。 疑点: 1、maxActive的含义是什么,是指所有的连接么不管有没有在工作的连接。 2、netstat看到的比maxActive要大很多,这是durid的bug么
[alibaba/druid]1.1.11 netstat命令查看到的连接比应用配置的maxActive值很多
回答
你好,xiaotian @wangxiaotianCoder 1、maxActive 指的是活跃连接数的阈值,你应该用netstat -antop | grep port | grep ESTABLISHED | wc -l它来统计连接数。2、你的 Druid 版本太旧了,新版本在连接管理方面做得更好。
我又确认一下,这700+的连接都是ESTABLISHED得状态。当时为了稳定,所以一直在用老版本,我应该用哪个版本的来避免这个问题呢? 另外我该怎么限制druid连接池里的总连接数,包括活跃的、非活跃的连接,我在druid的官网配置里没找到对应的配置项,还是说没有这方面的配置。
在某些旧版本中,连接总数可能超过最大活动配置,但 700 多个连接远超你遇到的 50 个连接,我猜想可能是其他地方出了问题。你可以尝试使用新版本,看看连接数是否仍然超过 700 个。如果问题依旧存在,那么问题基本就出在 Druid 上了。
经过一段时间后,连接数就回到个位数了。可能是应用刚启动的时候连接数建立的比较多,但是druid的maxActive却没有限制住。
are you try the newer version?
应用刚启动的时候连接数建立的比较多
druid建立连接的时候没有再用那个lock,应该是出于性能考虑吧,所以应用刚启动是activeCount=0 && poolingCount==0, 此时如果有数百个建立连接的请求,那么就会有很多连接发到数据库服务器,如果数据库服务端扛住了,还能支持这么多的并发连接请求,那么还好,否则你会看到获取连接超时的异常的。 当druid把这些建好的连接往连接池加的时候,不能不加锁了,因为计数器这个玩意只能一个线程搞,多个线程同时去搞就乱套了,druid通过那个lock加锁后将这些建好的连接加到连接池时,只能把超过maxActive的连接再close掉了。 这个也应该是很多帖子反馈activeCount=0但获取连接超时异常的主要原因,因为activeCount=0&&poolingCount=0时,druid是控制不住连接请求上限的,creatingCountUpdater.compareAndSet只是会减少一些请求,多数请求还是会送到数据库服务端。