使用数据库连接池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()。 

 

posted @   Peter.Jones  阅读(1305)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做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的全部参数信息
点击右上角即可分享
微信分享提示