Druid
文章平均质量分 83
Druid源码阅读及相关
冬天里的懒猫
这个作者很懒,什么都没留下…
展开
-
不同的数据库连接池(DBCP,C3P0,Druid,Hikari)下对mysql的insert和select性能对比
分别测试4中连接池(DBCP、C3P0、Druid、Hikari)的表现情况。1.环境准备1.1 连接池配置1.1.1 DBCPgradle导入包;implementation 'org.apache.commons:commons-dbcp2:2.9.0'application.yml配置:# DBCPspring.datasource.url: jdbc:mysql://192.168.162.49:3306/gts?useSSL=false&autoReconnect=tru原创 2021-09-14 11:37:41 · 721 阅读 · 0 评论 -
不同的数据库连接池(DBCP,C3P0,Druid,Hikari)下对mysql的随机update和insert性能对比
第二部分,对insert和update进行测试:1 环境准备分别准备了Insert和Update两种场景,其中,对于Update场景,还准备了通过索引更新和不走索引更新两种情况。1.1 Update代码如下:package com.dhb.gts.javacourse.week6.mysqltest;import com.dhb.gts.javacourse.fluent.dao.intf.OrderSummaryDao;import com.dhb.gts.javacourse.fluen原创 2021-09-14 17:41:30 · 583 阅读 · 1 评论 -
Druid源码阅读10-DruidDataSource中的一些计数器
在Druid连接池的工作过程中,会用到一些计数器对Druid的情况进行判断。然后根据计数器的数据采取一系列操作,整理如下:1.统计类的计数器变量名类型说明connectCountlonggetConnectionInternal被调用之后就会增加,意味着连接被get的次数。closeCountlong连接调用recycle中,包括回收、关闭等情况,成功之后会增加,标识连接关闭的次数。recycleCountlong连接调用recycle成功之后才会增加,不包原创 2021-11-19 20:48:50 · 1208 阅读 · 0 评论 -
Druid源码阅读9-DruidDataSource和DruidConnection中的状态
DruidPooledConnection中的状态:字段类型所在类默认值说明closedvolatile booleanDruidPooledConnectionfalse关闭状态,recycle到连接池中的连接会修改为true。但是这个状态通常只在checkStateInternal中单独使用。判断连接是否关闭需要结合(closed or disable)disablevolatile booleanDruidPooledConnectionfal原创 2021-11-18 18:20:57 · 907 阅读 · 0 评论 -
Druid源码阅读8-DruidDataSource的removeAbandoned机制
有关于Druid的removeAbandoned机制,在getConnection源码中介绍过。removeAbandoned实际上就是Druid的泄露检测机制。主要的参数有:参数说明removeAbandoned如果连接泄露,是否需要回收泄露的连接,默认false;logAbandoned如果回收了泄露的连接,是否要打印一条log,默认false;removeAbandonedTimeoutMillis连接回收的超时时间,默认5分钟;removeAbandon原创 2021-11-17 18:39:18 · 1161 阅读 · 0 评论 -
Druid源码阅读7-DruidDataSource的recycle过程
Druid中的Connection在使用之后,要进行回收,而回收连接的方法就是recucle方法。回收的主要目的是将连接的状态清空/重置之后,放置到连接池的connections数组的尾部,然后发送连接池lock的notEmpty条件变量通知消息,让等待的消费者线程来获取连接。1.回收过程回收方法首先要做的是,判断回收线程是否为同一个线程。如果不是,则打印日志输出。if (logDifferentThread // && (!isAsyncCloseConnectionEna原创 2021-11-16 19:40:09 · 834 阅读 · 0 评论 -
Druid源码阅读6-PreparedStatementPool源码及使用场景分析
**在阅读DruidDataSource源码的过程中,发现DruidConnectionHolder有个特别的属性PreparedStatementPool statementPool。根据经验可知,这是DruidPreparedStatement进行缓存的cache。我们在使用PreparedStatement的过程中,由于PreparedStatement对sql语句的解析和参数的注入是分开的,因此,加入cache之后,可以在同一个连接上,对相同sql,不同参数的请求进行复用。1.开启参数如果要原创 2021-11-15 20:19:11 · 1660 阅读 · 0 评论 -
Druid源码阅读5-DruidDataSource的shrink过程
shrink方法是DestroyTask线程中回收连接的具体执行方法。首先获得锁:try { lock.lockInterruptibly();} catch (InterruptedException e) { return;}之后,要判断初始化状态是否完成,如果采用异步初始化,可能DestoryTask线程已经启动,但是连接池还没有初始化完成。if (!inited) { return;}之后对连接池中的连接进行遍历,connections中,可连接的连接数记原创 2021-11-13 23:23:03 · 940 阅读 · 0 评论 -
Druid源码阅读4-DruidDataSource的getConnection过程
DruidDataSource连接池实现了javaX.sql包中,DataSource接口的全部方法。getConnection也来自于javaX.sql.DataSource接口。而DruidPooledConnection也实现了接口java.sql.Connection。这样就能在各种场景中通过这个接口来获取数据库连接。1.fileter处理–责任链模式在执行getConnection方法的过程中,首先确认DataSource是否完成了初始化。由于 init方法采用了Double Check机原创 2021-11-11 14:38:53 · 1790 阅读 · 0 评论 -
Druid源码阅读3-DruidDataSource连接池的基本原理
DruidDataSource数据库连接池的的本质,实际上是一个利用ReentrentLock和两个Condition组成的生产者和消费者模型。1.DruidDataSource中的锁在DruidAbstractDataSource类中,定义了一个非常重要的锁,几乎所有的线程都使用到了这个锁。//可重入锁 lockprotected ReentrantLock lock;//非空条件变量protected Condition原创 2021-11-10 16:34:39 · 1857 阅读 · 0 评论 -
Druid源码阅读2-DruidDataSource的init过程
DruidDataSource的使用都是创建DruidDataSource对象,set配置参数之后,调用init方法。通过mock测试实例化DruidDataSource:DruidDataSource ds = new DruidDataSource();ds.setUrl("jdbc:fake:dragoon_v25masterdb");ds.setUsername("tddl5");ds.setPassword("tddl5");ds.setFilters("stat");ds.init原创 2021-11-09 18:24:03 · 1710 阅读 · 0 评论 -
Druid源码阅读1-DruidDataSource数据结构
DruidDataSource是DruidCP最关键的类之一,承载了连接池的启动、关闭、以及连接的获取和管理等功能。其内部关键的的数据结构如下表:nametype说明connectionsvolatile DruidConnectionHolder[]pool的关键数组,存放连接,实际上是DruidConnectionHolder的数组。Connection由DruidConnectionHolder持有evictConnectionsDruidConnectionHo原创 2021-11-08 20:26:42 · 718 阅读 · 0 评论