随笔分类 -  DB及框架 / druid

摘要:一、Druid数据源连接池概念 ​ 对于连接来说,建立连接和销毁连接是非常耗时的,因此使用池化思想,将连接放入连接池中,便于复用。 ​ 1、Druid 中连接的概念 ​ 由于将连接放入了连接池,那么就存在两个维度的连接,一个是在连接池中真实的物理连接,一个是应用角度获取到的连接,即逻辑连接。物理连接 阅读全文
posted @ 2023-12-24 14:00 李聪龙 阅读(419) 评论(0) 推荐(0) 编辑
摘要:一、架构分析 ​ Druid类图如下所示: ​ 两大核心类:DruidDataSource和DruidAbstractDataSource ​ 连接有效性check:从连接池中获取连接后会做有效性check,在类中有ValidConnectionChecker接口,对应有不同数据库的实现 ​ 异常处 阅读全文
posted @ 2023-12-24 13:58 李聪龙 阅读(642) 评论(0) 推荐(0) 编辑
摘要:一、Druid基本配置 1、基于Spring配置文件的方式 spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: Asia/Shanghai datasource: druid: driver-class-name: com.mys 阅读全文
posted @ 2023-12-11 13:39 李聪龙 阅读(56) 评论(0) 推荐(0) 编辑
摘要:在Druid连接池的工作过程中,会用到一些计数器对Druid的情况进行判断。然后根据计数器的数据采取一系列操作,整理如下: 1.统计类的计数器 变量名 类型 说明 connectCount long getConnectionInternal被调用之后就会增加,意味着连接被get的次数。 close 阅读全文
posted @ 2022-05-20 23:44 李聪龙 阅读(718) 评论(0) 推荐(0) 编辑
摘要:DruidPooledConnection中的状态: 字段 类型 所在类 默认值 说明 closed volatile boolean DruidPooledConnection false 关闭状态,recycle到连接池中的连接会修改为true。但是这个状态通常只在checkStateInter 阅读全文
posted @ 2022-05-19 20:17 李聪龙 阅读(572) 评论(0) 推荐(0) 编辑
摘要:有关于Druid的removeAbandoned机制,在getConnection源码中介绍过。removeAbandoned实际上就是Druid的泄露检测机制。主要的参数有: 参数 说明 removeAbandoned 如果连接泄露,是否需要回收泄露的连接,默认false; logAbandone 阅读全文
posted @ 2022-05-19 00:36 李聪龙 阅读(228) 评论(0) 推荐(0) 编辑
摘要:Druid中的Connection在使用之后,要进行回收,而回收连接的方法就是recucle方法。 回收的主要目的是将连接的状态清空/重置之后,放置到连接池的connections数组的尾部,然后发送连接池lock的notEmpty条件变量通知消息,让等待的消费者线程来获取连接。 一、回收过程 回收 阅读全文
posted @ 2022-05-17 23:08 李聪龙 阅读(806) 评论(0) 推荐(0) 编辑
摘要:在阅读DruidDataSource源码的过程中,发现DruidConnectionHolder有个特别的属性PreparedStatementPool statementPool。 根据经验可知,这是DruidPreparedStatement进行缓存的cache。我们在使用PreparedSta 阅读全文
posted @ 2022-05-17 00:00 李聪龙 阅读(3195) 评论(0) 推荐(0) 编辑
摘要:shrink方法是DestroyTask线程中回收连接的具体执行方法。 首先获得锁: try { lock.lockInterruptibly(); } catch (InterruptedException e) { return; } 之后,要判断初始化状态是否完成,如果采用异步初始化,可能De 阅读全文
posted @ 2022-05-15 03:04 李聪龙 阅读(297) 评论(0) 推荐(0) 编辑
摘要:DruidDataSource连接池实现了javaX.sql包中DataSource接口的全部方法。getConnection也来自于javaX.sql.DataSource接口。 而DruidPooledConnection也实现了接口java.sql.Connection。 这样就能在各种场景中 阅读全文
posted @ 2022-05-14 00:56 李聪龙 阅读(2343) 评论(0) 推荐(0) 编辑
摘要:一、双重检测锁 在线程池初始化时,为了保证并发安全,同时为了保证初始化性能,使用了双重检测锁进行初始化,代码如下所示, 第一步的判断是为了保证效率:毕竟初始化只是在连接池没有初始化或没有初始化完成时才会去调用初始化逻辑,在大多数场景,连接池已经初始化完成,所以如果不加第一个是否已完成初始化的判断,那 阅读全文
posted @ 2022-05-12 22:02 李聪龙 阅读(646) 评论(0) 推荐(0) 编辑
摘要:在获取连接时,会执行初始化方法 init() ,使用 DruidDataSource的入口。 一、双检测保证并发安全与性能 为了保证不会重复初始化并且保证性能,使用了类似双重检测锁的方式来处理,第一次判断 inited 标识,如果已经初始化,则则直接返回,如果没有初始化,则使用ReentrantLo 阅读全文
posted @ 2022-05-11 19:21 李聪龙 阅读(2274) 评论(0) 推荐(0) 编辑
摘要:一、项目介绍 1、Druid简介 Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。 Github项目地址 https://github.com/alibaba/dr 阅读全文
posted @ 2022-05-10 23:19 李聪龙 阅读(2274) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示