一、数据库连接池初始化


(1)、 如果设置了maxWait或者构造函数参数传入的为true,则创建的ReentrantLock为公平锁,否者为非公平锁
(2)、 如果设置了initialSize>=1,则会启动是创建initialSize个数数据库物理连接到线程池。
(3)、 如果没设置createScheduler则创建并启动数据库连接创建线程,如果没设置destroyScheduler则创建并启动数据库连接回收线程,如果timeBetweenLogStatsMillis>0则创建logstat线程。

二、获取数据库连接


(1)、 如果当前数据库连接池有可用连接,则直接获取,否者如果设置createScheduler则开启一个新线程去创建物理连接,否者发送发送signal信号唤醒连接创建线程创建数据库物理连接,这种情况有分pollLast和takeLast,区别在于前者设置max
wait超时时间,如果在时间内还没获取链接则返回null,后者则一直等待连接创建。

三、回收数据库连接


(1)、 在调用conn.close时候会回收当前连接到线程池

四、创建数据库连接线程


(1)、此图createScheduler=null的情况,为null从上面知道在初始化时候会新建
一个数据库连接创建线程。

五、连接池同步策略

实际上是个生产者消费者模式,生产者是连接创建线程和连接回收线程,消费者是获取连接的线程。
首先列下同步需要的条件变量和锁:

 //独占锁(用来控制同是只有一个线程访问线程池),根据lockFair分为公平和非公平锁lock     = new ReentrantLock(lockFair);//用来对消费和生成线程做同步notEmpty = lock.newCondition();empty    = lock.newCondition();//共享资源,线程池是一个数组connections = new DruidConnectionHolder[maxActive];

消费者(获取数据库连接线程):

DruidConnectionHolder pollLast(){DruidConnectionHolder holder;try {//加独占锁lock.lockInterruptibly();} catch (InterruptedException e) {connectErrorCount.incrementAndGet();throw new SQLException("interrupt", e);}try {//通知连接创建线程,创建数据库连接empty.signal();//等待连接创建线程或者连接回收线程发送信号estimate = notEmpty.awaitNanos(estimate);//获取链接,并返回decrementPoolingCount();holder = connections[poolingCount];connections[poolingCount] = null;}finally{//释放独占锁lock.unlock();}holder.incrementUseCount();DruidPooledConnection poolalbeConnection = new DruidPooledConnection(holder);return poolalbeConnection;
}

生产者(连接创建线程):

public void run(){try {//独占锁lock.lockInterruptibly();} catch (InterruptedException e2) {break;}try {// 必须存在线程等待,才创建连接if (poolingCount >= notEmptyWaitThreadCount) {empty.await();//会释放当前独占锁}// 防止创建超过maxActive数量的连接if (activeCount + poolingCount >= maxActive) {empty.await();//会释放当前独占锁}} finally {lock.unlock();}Connection connection = null;try {//创建物理链接connection = createPhysicalConnection();} catch (SQLException e) {。。。。} catch (RuntimeException e) {。。。。} catch (Error e) {。。。。}lock.lock();try {//连接入池connections[poolingCount] = holder;incrementPoolingCount();if (poolingCount > poolingPeak) {poolingPeak = poolingCount;poolingPeakTime = System.currentTimeMillis();}//发出信号,激活消费线程notEmpty.signal();notEmptySignalCount++;} finally {lock.unlock();}}

生产者(数据库连接回收线程):

protected void recycle(DruidPooledConnection pooledConnection){lock.lockInterruptibly();try {activeCount--;closeCount++;connections[poolingCount] = e;incrementPoolingCount();if (poolingCount > poolingPeak) {poolingPeak = poolingCount;poolingPeakTime = lastActiveTimeMillis;}//激活消费线程notEmpty.signal();notEmptySignalCount++;      recycleCount++;} finally {lock.unlock();}
}

Druid连接池原理相关推荐

  1. 泥瓦匠进阶:连接池原理设计并不难

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...

  2. SSM中使用Druid连接池

    连接池 最原始的数据库使用就是打开一个连接并进行使用,使用过后一定要关闭连接释放资源.由于频繁的打开和关闭连接对jvm包括数据库都有一定的资源负荷,尤其应用压力较大时资源占用比较多容易产生性能问题.由 ...

  3. druid连接池mysql自动关闭_探究Druid连接池“违反协议”异常

    作者:董添 使用Druid连接池和PreparedStatement Cache后,应用访问数据库的效率提高了,针对连接池的监控手段也变多了,但是随之而来也出现了一些新的问题,最近发现在给表增加字段后 ...

  4. Druid连接池报错:org.postgresql.util.PSQLException: FATAL: too many connections for role “*********“

    一 错误描述 1 负责的BI中的数据数据可视化项目一直运行的比较稳定,突然早上用户反馈,报表查询非常慢,非常卡,而且有些网页直接打不开(单体应用,没有降级和熔断). 2 没一会CPU就报警了,CPU使 ...

  5. 使用H2Database+Druid连接池+Spring Data JPA+Ehcache实现CRUD操作

    前言 注:本篇为纯实践篇,主要用于技术整合,介绍如何搭建一个完整全面的Web项目.如果对于技术原理还不了解的童鞋可点击下方链接,学习后在来~ H2数据库教程:H2数据库入门 缓存使用教程:在Sprin ...

  6. Druid连接池源代码分析之一

    Druid功能简介 Druid是阿里开源的连接池,连接池的主要作用是为了复用,比如一般的数据库建立一个连接需要初始化很多对象,并且再加上tcp的三次握手,四次挥手的协议,所以整体的代价比较高,并且在一 ...

  7. JDBCC3P0连接池Druid连接池

    typora-root-url: img typora-copy-images-to: img JDBC&连接池 回顾 会使用mysql字符串函数 CONCAT: 连接字符串 CHAR_LEN ...

  8. c3p0和jdbctemplate配置oracle集群rac,C3P0连接池、DRUID连接池和JdbcTemplate

    目录 一.C3P0连接池 1.C3P0连接池简介 2.常用的配置参数 3.C3P0连接池基本使用 (1)C3P0配置文件 (2)API介绍 4.使用步骤 二.DRUID连接池 1. DRUID简介 2 ...

  9. 注意:阿里Druid连接池监控的两个坑

    image 阿里的Druid大家都知道是最好的连接池,其强大的监控功能是我们追求的重要特性.但在实际情况中也有不少坑,说下最近遇到的一个坑吧! 问题1:不断打印error级别的错误日志 session ...

  10. 使用druid连接池的超时回收机制排查连接泄露问题

    参考:http://www.cnblogs.com/netcorner/p/4380949.html 在工程中使用了druid连接池,运行一段时间后系统出现异常: Caused by: org.spr ...

最新文章

  1. 全球首个内河无人驾驶数据集来了!西安AI公司推出,姚期智投资
  2. SQL获取所有数据库名、表名、储存过程以及参数列表
  3. [Qt-creator]实用技巧----基于ubuntu
  4. AI人才缺口达百万:做了AI,就一定能拿到高薪offer吗?
  5. power bi_如何将Power BI模型的尺寸减少90%!
  6. 阿里发布2020农产品电商报告数字农业将成风口
  7. 用winformz时间格式不正确_巨峰葡萄不能膨大?错!在正确的时间,用对方法,收获优质果穗型...
  8. bzoj 4002: [JLOI2015]有意义的字符串(特征根法+矩阵快速幂)
  9. 学用MVC4做网站:序
  10. python turtle原点位置_python中turtle库中setworldcoordinates(坐标系的移动)
  11. 推荐这几个不错的提取伴奏在线软件给大家
  12. 更改linux文件/目录的权限、拥有者及用户组
  13. 计算机三级网络几时出成绩,全国计算机等级考试成绩查询时间是什么时候?
  14. Windows10下Latex缺少sty文件时的安装方法
  15. java8合并两个List
  16. wz的作战演习计划--分治思想
  17. 遵循IEC 61512/ ISA 88构建数字化工厂
  18. 吐槽大会java_Rust吐槽大会纪要
  19. Linux命令行与shell脚本编程大全(shell脚本编程基础部分)
  20. wechat-web-devtools 之linux

热门文章

  1. Xcode ImageOptim Compress PNG Files
  2. 计算机无法安装网卡驱动,网卡驱动安装不了,详细教您解决网卡驱动安装不了...
  3. mysql双机热备份
  4. Http协议详解版本一
  5. mysql sql 0填充_sql - MySQL - 如何用“0”填充前面的邮政编码?
  6. Aop切面自定义注解的使用
  7. 《Unity shader入门精要》阅读笔记
  8. Hadoop基础组件思维导图
  9. 多源信息融合与多视角学习
  10. RTL8211E网口芯片在Uboot下调试问题