使用数据库连接池Druid 时 如果未主动关闭连接,会怎样 备忘录
开启连接泄露检测:
removeAbandoned=true
一旦开启,CreateConnectionThread 线程就会每隔 timeBetweenEvictionRunsMillis 毫秒轮询一次,
检测是否存在 running=false 且 空闲时间超过 removeAbandonedTimeoutMillis 毫秒 的连接,
如果存在,就close掉,此时
1. 集合 activeConnections 会移除这个连接。
2. 调用close()关闭连接 , activeCount会减1。
特注:
如果开启,在获取连接时,集合 activeConnections 存放该连接。
如果未开启,在获取连接时,集合 activeConnections 不会存放任何连接。
所以,如果项目上线后,未开启泄露检测,一旦存在未关闭的连接,这些连接不会被关闭,activeCount 统计值不会减1,集合 activeConnections 不会保存,
此时,这些连接对象会怎么办?
1. 不会被复用;
2.一段时间后会被JVM垃圾回收;
3.造成 activeCount 统计不准确,从而影响 activeCount 和 maxActive 的比较。
举例:如果 maxActive=10, 有10个连接获取后未被close(), 此时再获取连接,是获取不到的。 这是一个微小的bug, activeCount 统计不准确导致的,留一下就行,一般不会被发现,也很少会遇见这样的情况, 原因是:Spring和Mybatis 每次获取连接后,都会主动调用close()。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
2019-11-20 MySQL某字段内容是字符串, 英文逗号隔开, 查询这个字段是否包含某个字符串
2019-11-20 MySQL分区和手动分表选择
2019-11-20 NIO中简单api demo 文件输入输出
2019-11-20 NIO原理
2018-11-20 HttpServletRequest中request的全部参数信息