Druid数据连接池实现--基于Datart代码梳理

背景

在搭建物联网平台的过程中,涉及到对采集的数据进行验证、转换、清洗加工处理的流程,简单的思路就是硬编码实现,但是为了沉淀中台能力就需要进行自定义配置,根据配置对不同数据进行校验以及加工转换。对于字段的校验这里就不多做解释,主要是涉及对数据进行二次加工需要使用动态数据源配置,即可以在界面上进行数据源配置同时选择该数据源后自定义sql进行查询。
其实之前对这块也一直没有过多关注过,刚好遇到了这个场景,花了一天的时间梳理并实现一个简单的代码,因为之前用过bi报表,大概也看了下,知道基本上都实现了该功能,有了基本方向,然后在此基础上进行的梳理,基本事半功倍了。梳理完成后,后续就可以整合到自己的项目中去使用了。
本次主要借鉴的是Datart的实现思路

早期的数据源连接

在我接触计算机编程那会(2008年左右),学习的都是原生的JDBC连接数据库,后面spring + mybatis框架流行后,基本上都用的已经封装好的数据库连接池了,这里需要复习下是因为底层的实现其实最终还是需要使用JDBC

JDBC 的功能

(1) 与数据库建立连接。
(2) 向数据库发送 SQL 语句并执行这些语句。
(3) 处理数据返回的结果。

JDBC 的常用接口和类

(1) Driver 接口:加载驱动程序。
(2) DriverManager 类:装人所需的 JDBC 驱动程序,编程时调用它的方法来创建连接。
(3) Connection 接口:编程时使用该类对象创建 Statement 对象。
(4) Statement 接口:编程时使用该类对象得到 ResultSet 对象。
(5) ResultSet 类:负责保存 Statement 执行后所产生的查询结果。

代码实现

(1)、注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
(2)、获取连接
Connection com = DriverManager.getConnection("jdbc:mysql://xxxx:3306/xxx", "root", "xxxx");
(3)、获取执行者连接
Statement stat = com.createStatement();
(4)、执行 SQL 语句,并接收结果
String sql = "SELECT * FROM user";
ResultSet rs = stat.executeQuery(sql);
(5)、处理结果
while (rs.next()){
        System.out.println(rs.getInt("id") + "\t" + rs.getString("name"));
}
(6)、释放资源
com.close();
stat.close();
com.close();

Datart实现逻辑

找到切入口

虽然整体上实现逻辑不是特别复杂,但是对于一部分人来说也可能没有头绪,这里按照我的切入点一步步说明下。
首先,找到切入点,最简单的就是页面的接口调用方法
Druid数据连接池实现--基于Datart代码梳理_第1张图片
这里点击测试连接后获取到调用地址,找到controller层
Druid数据连接池实现--基于Datart代码梳理_第2张图片
顺藤摸瓜即可
Druid数据连接池实现--基于Datart代码梳理_第3张图片
Druid数据连接池实现--基于Datart代码梳理_第4张图片
这里可以看到主要是获取到数据源,然后执行了一下测试,那我们就看数据源从哪里获取的,又是怎么写入的,基本就解决我们的问题了
Druid数据连接池实现--基于Datart代码梳理_第5张图片
上面的这块代码是比较典型的本地缓存处理逻辑:缓存没有就获取,有就拿到返回一下,那我们现在就先看怎么获取的
Druid数据连接池实现--基于Datart代码梳理_第6张图片
这块使用了类加载机制SPI,为了方便拓展,处理逻辑这里就不讲了,根据类型,将实例化对象写入内存中方便后续使用,基本上怎么来就讲通了,但是可能会疑惑这块跟数据库没有任何关系呀?所以要继续看里面是怎么做的,我们接着看DataProvider.test()方法
Druid数据连接池实现--基于Datart代码梳理_第7张图片
这个类是一个抽象工厂类,有很多不同实现逻辑,因为我们是用的JDBC机制,所以直接看JdbcDataProvider即可
Druid数据连接池实现--基于Datart代码梳理_第8张图片
已经慢慢到最下面了,这块可以看到对参数进行了一个转换适配,具体如何适配就是根据自己业务的需要自己定义了
Druid数据连接池实现--基于Datart代码梳理_第9张图片
然后就开始创建数据源了
Druid数据连接池实现--基于Datart代码梳理_第10张图片
Class.forName已经出现了,获取到对象后调用init方法
Druid数据连接池实现--基于Datart代码梳理_第11张图片
最后调用Druid创建数据源返回,然后获取连接测试,完成连接测试逻辑
Druid数据连接池实现--基于Datart代码梳理_第12张图片
Druid数据连接池实现--基于Datart代码梳理_第13张图片
流程结束,同样的逻辑可以看下如何执行SQL,因为SQL的封装处理比较多,涉及权限、数据加工处理等等,是BI的核心机制了,没有这个简单清晰,流程图后续可以整理一下

提取代码自己封装

我们自己提取就可以比较简单,因为只是用多数据源以及少许sql的处理

获取数据源/指定数据源

Druid数据连接池实现--基于Datart代码梳理_第14张图片

执行sql语句

Druid数据连接池实现--基于Datart代码梳理_第15张图片
Druid数据连接池实现--基于Datart代码梳理_第16张图片
Druid数据连接池实现--基于Datart代码梳理_第17张图片

处理返回结果

Druid数据连接池实现--基于Datart代码梳理_第18张图片

运行效果

Druid数据连接池实现--基于Datart代码梳理_第19张图片

总结

基本上如果对SPI机制熟悉,一些设计模式了解,将代码提炼出来还是比较简单的,后续业务上要使用再进行二次封装,配合页面配置就可以实现自己的动态数据连接池了

你可能感兴趣的:(微服务笔记,java,数据库)