Druid连接池源码解析(8)DruidPooledStatement

Druid连接池源码解析(8)DruidPooledStatement,第1张

本来以为pool包收尾了,扫了一下发现还有statement,这块比较简单,是对JDBC的Statement进行了一些封装,实现了与连接池对应的功能,看下类图:

DruidPooledStatement 中最重要的就是execute开头的一系列方法了,是执行SQL的本体,都是对JDBC的Statement的增强,主要多做了以下:

DruidPooledPreparedStatement实现了JDBC的PreparedStatement,是执行预编译的SQL用,跟Connection相同,引入了PreparedStatementHolder这样一个Holder类,同样定义了一些统计属性,其中有个属性pooling,是否池化,引出了PreparedStatementPool,里面用LinkedHashMap实现了LRU,一个cache类用来缓存预编译过的statement;

cache的key定义了一个类,PreparedStatementKey,重写了hashcode和equals方法,很有意思地参考了String的hashcode,用了31这个质数作进制来计算hash,且不仅仅是sql语句相同,需要其他属性都相同才算相同,贴一下源码

CallableStatement是用来执行函数或者存储过程的,在当下的大环境下,用得真的很少就略过了吧。

druid在JDBC的statement基础上,封装了一些类来扩展自己的属性和功能,一般在工程环境下,基本就用AOP或者装饰器模式来实现(感觉这个Holder有点像装饰器,又有点像单例的Holder)的,写框架的时候,这种方式还是很值得借鉴的,很内聚、高效,也没有额外的引用

cache的使用很巧妙,但是在刷文章的时候看到过一个问题,虽然在后续版本中修复了,但还是分享一下:

探究Druid连接池“违反协议”异常

这个问题抛的是SQL异常,问题却出在缓存上,对与缓的状态和刷新策略,有了新的认识

回想我们上节的内容,有两个地方跳过了,一个是启动创建链接的线程,一个是启动销毁链接的线程,我们这次就来详细的探究一番这两个的用途。

首先我们需要回头介绍之前没有讲解的三个 connection 数组的概念:

其主要流程如下:

我们来看一下主要流程:

销毁线程主要做两件事情,一个是销毁超过最大空闲连接数量的链接,一个是回收超时的链接。我们先来看一下第一个:

其主要步骤如下:

这里的逻辑比较简单,首先是遍历所有活动的链接,假如连接在运行就跳到下一个,假如不在运行,检查是否超时,假如是就将连接放入丢弃队列中,然后遍历丢弃队列,将连接关闭。

以上就是关于Druid连接池源码解析(8)DruidPooledStatement全部的内容,包括:Druid连接池源码解析(8)DruidPooledStatement、[druid 源码解析] 3 创建连接&销毁连接、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9497684.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存