文档章节

Druid连接管理分析

无毁的湖光-Al
 无毁的湖光-Al
发布于 2017/02/08 15:21
字数 823
阅读 367
收藏 3

Druid创建连接的过程

        Druid是通过一个创建连接线程来完成连接,如下图所示:

               

        Druid有且只有一个线程来创建连接,为了防止不必要的线程时间片的消耗,其采用了await()/notify()的方式,当其创建了足够的多的连接之后就处于调用await(),使得线程处于blocked状态。当其接收到其它线程的notify()信号之后,才开始重新创建新的连接。Java的线程机制如下图所示:

        值得注意的是:Java线程模型中,wait()是到等待队列状态,而获取到notify()信号是到锁池状态,而不是可运行态。这个锁池状态类似于C中的condition条件变量,保证了仅仅有一个线程获取到信号并进入可运行的状态。

Druid获取连接的过程

        上层应用在获取MySql Connection的时候是调用的getConnection接口,其内部具体的过程如上图的左半部分所示,值得注意的是其创建连接过程中

        a)  首先是从连接池中获取已有的连接。

        b)  如果连接池中有连接,则检查是否可用,不可用丢弃并重新获取连接,可用直接返回。

        c)  如果连接池中没有连接,则对创建连接线程notify(),并等待一个最大的超时时间。如果在这个超时时间之内,创建连接线程给了其一个notify()信号的话,表明已经有了可用连接,则当前获取连接的线程进行到可运行状态并从连接池中拿到这个连接。中间过程是有lock保证的,所以不会有多线程争用一个的情况。

        d)  如果超过了最大超时时间,则抛出异常"create connection error",这个错误和线上日志打印出来的情况一致。               

Druid删除不可用连接的过程

        Druid数据源连接池有三地方删除不可用连接:

        a)  删除不可用连接线程(DestroyConnectionThread)

        b)  获取连接后进行连接测试的过程

        c)  连接在上层运行过程中报出RuntimeException

        Druid的删除不可用连接线程如下图所示:

        在"收缩连接池"的过程中,会根据当前连接的使用情况,删除不必要的连接。具体算法是,遍历连接,发现当前拿到的连接的idleTime大于所设置的minEvictableIdleTimeMillis里面。则将其加入到删除连接的列表里面。最后遍历列表进行jdbcUtils.close。

        在下一个阶段"删除疑似连接泄露的连接过程中,则是判断一个可用连接已经>最大能容忍的使用连接的时间(这个时间通常设置的很长),如果是则直接close掉此连接。因为这个连接可能运行了某些SQL,导致连接泄露的情况(这一阶段可配置)。

        其它两种删除连接的情况都是调用discardConnection这个函数,不同的是(3)是在抛出runTimeException的时候再处理这个异常的时候才调用discardConnection,并打印出"discard connection"

## 原文链接   

https://my.oschina.net/alchemystar/blog/834063   

© 著作权归作者所有

无毁的湖光-Al

无毁的湖光-Al

粉丝 368
博文 28
码字总数 46437
作品 0
浦东
后端工程师
私信 提问
阿里Druid数据连接池在SSM框架中的配置使用

Druid数据连接池简介 首先可以参考阿里在GitHub给出的一些说明: Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。 性能好,同时自带监控页面,可以实时监控应用的...

似水的流年
2017/12/31
0
0
Druid 0.2.16 发布,阿里巴巴开源数据库连接池

下载地址: http://code.alibabatech.com/mvn/releases/com/alibaba/druid/0.2.16/ Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据...

Google
2013/04/25
3.4K
15
JDBC 连接池、监控组件 - Druid

Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 DruidDataSource 高效可管理的数据库连接池。 SQLParser Druid可以做什么? 1) 可...

wenshao
2010/11/15
0
89
Druid 1.0.1 发布,阿里巴巴数据库连接池

Druid 1.0.1 发布,更新内容如下: bug修复: DRUID-305 Updated: 25/Nov/13 修复 DruidDataSource 中创建链异常空判断错误 改进: DRUID-306 Updated: 25/Nov/13 增强SQL注入拦截规则 Drui...

oschina
2013/12/13
5.3K
23
在Java中开源的数据库连接池

在Java中开源的数据库连接池有以下几种 : 1, C3P0 C3P0是一个开放源代码的JDBC连接池,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。 https://gith...

壶漏子
2015/09/28
201
0

没有更多内容

加载失败,请刷新页面

加载更多

好文:华杉:我等用功,不求日增,但求日减。减一分人欲,则增一分天理,这是何等简易!何等洒脱!

#写在前面1.怎么理解“减一分人欲,则增一分天理,这是何等简易!”?1)华杉提倡 “一劳永逸” 排除浪费,少干活,多赚钱,一战而定,降低作业成本。2)华杉提倡学海无涯,回头是岸...

阿锋zxf
25分钟前
3
0
vue 的bus总线

bus声明 global.bus = new Vue() 事件发送 controlTabbar () {global.bus.$emit('pickUp', 'ddd')}, 事件接收 global.bus.$on('pickUp', (res) => {this.isFocus = true})......

Js_Mei
30分钟前
2
0
大型系统演进之路-负载均衡演进

Nginx做负载均衡 通过Nginx的反向代理将请求分发到tomcat中,如果tomcat支持100并发,Nginx支持50000并发,理论上nginx把请求发送到500个tomcat就可以了。 LVS或F5做多个Nginx负载均衡 Tomc...

春哥大魔王的博客
35分钟前
4
0
Sqlite时间段查询中遇到的问题

问题: 我要查询DateTime时间其中的一段符合时间要求的数据,比如我要查询‘2019-06-06 16:50:00’至‘2019-06-06 16:59:00’这一段的数据 开始用这段代码 strSql= ("select * from Coll...

rainbowcode
39分钟前
2
0
大数据(hadoop-数据入库系统Sqoop原理架构)

Sqoop是什么 Sqoop:SQL-to-Hadoop 连接传统关系型数据库和Hadoop的桥梁 把关系型数据库的数据导入到 Hadoop 系统 ( 如 HDFS、HBase 和 Hive) 中; 把数据从 Hadoop 系统里抽取并导出到关系型...

这很耳东先生
54分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部