Druid源码的心得

Druid是一个JDBC组件,它包括三部分: 

  • DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 

  • DruidDataSource 高效可管理的数据库连接池。 

  • SQLParser 

DruidDriver 代理Driver,在druid中这个Filter-Chain模式就是责任链模式,该模式可以参考文章:https://www.cnblogs.com/fanyang219/p/6432815.html

在Filter-Chain模式中,我们首先的了解一次数据操作的过程为(网上获取):

然后对比Druid的数据模式(网上获取):

可以看出就是对connect  statement和其继承类进行代理,然后每次请求都走其代理类,然后进行统计。这和Sentinel中获取方式不一样,Sentinel只直接对要监控的代码直接创建一个Entry进行统计,相同点都是采用责任链方式进行处理。

DruidDataSource 高效可管理的数据库连接池时候,首先了解LOCK的CONDITION模式,该模式详细解析可以参考:https://www.cnblogs.com/alexlo/p/5614211.html。

理解condition模式时候,其实一个condition对象,就是一个AQS对象,阻塞的情况就是将该线程放到该condition队列,原理不懂的可以参考文章https://blog.csdn.net/dainandainan1/article/details/87182391

Condition它更强大的地方在于:能够更加精细的控制多线程的休眠与唤醒。对于同一个锁,我们可以创建多个Condition,在不同的情况下使用不同的Condition。例如,假如多线程读/写同一个缓冲区:当向缓冲区中写入数据之后,唤醒"读线程";当从缓冲区读出数据之后,唤醒"写线程";并且当缓冲区满的时候,"写线程"需要等待;当缓冲区为空时,"读线程"需要等待。      

DruidDataSource本质就是基于LOCK的CONDITION一种高效的生产者消费者模式。可以参考文章:https://www.jianshu.com/p/16a646a4eccd

在druidDataSource中有一个重入锁,衍生两个condition,一个监控连接池是否为空,一个监控连接池不为空。
在该类中有两个线程,一个生成连接,一个回收连接。在创建、获取、回收的时候都会使用这些锁和condition。

 

由于数据连接数组是公共资源,所以在多线程并行的情况下,要加锁使用。
而在用户线程发现连接池中没有资源之后就会与创建连接的线程进行通信。

SQLParser 这个语法解析原理就是大学将的编译原理部分,在druid的SQLParser 的解析过程中进行了分类,统计之类的操作,本人细看,以后有机会在补充。可以参考文章https://www.cnblogs.com/lay2017/p/9840394.html

 



 

 

你可能感兴趣的:(经验积累)