Druid连接管理分析

Stella981
• 阅读 597

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
SpringBoot 开启Druid监控统计功能教程
Druid数据连接池简介Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。性能好,同时自带监控页面,可以实时监控应用的连接池情况以及其中性能差的sql,方便我们找出应用中连接池方面的问题。Druid是一个JDBC组件,它包括三部分:1.DruidDriver代理
Stella981 Stella981
3年前
Druid连接池简单入门配置
偶尔的机会解释Druid连接池,后起之秀,但是评价不错,另外由于是阿里淘宝使用过的所以还是蛮看好的。Druid集连接池,监控于一体整好复合当前项目的需要,项目是ssh结构,之前是用C3p0的,现在换一个连接池也是很简单的,首先spring配置DataSource,配置如下:<bean id"dataSource" class"co
Wesley13 Wesley13
3年前
Java 学习笔记 三
一、Druid的简单使用1try{2//1.创建Druid数据源对象3DruidDataSourcedataSourcenewDruidDataSource();45//2.设置数据库连接信息6
Stella981 Stella981
3年前
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法参考文章:(1)Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.codeprj.com%2Fblo
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这