1

本文亮点

目前百度到的整合druid多数据源的文章多是一主一从,也没介绍怎么拓展更多数据源,经过几天摸索,终于搞出了能用的版本。目前有以下几个功能

1.整合druid,实现一主两从架构
2.默认采用主写从读
3.可在代码中通过注解指定读取主库还是从库

本文更多的是对网上现有文章的补充,侧重描述我在摸索过程中的疑难点,具体的知识点之类的,请大家参考下网络上的其它文字。

源代码

先贴出代码地址:链接

两个关键问题

摸索过程中,有两个问题是我比较困惑的

1.数据库是怎么连接上的?
2.切换数据库源是如何实现的?

为了不影响阅读,配置文件和pom依赖放在文末

1.数据库是怎么连接上的?

我是通过配置文件配置的druid,其实master、slave1、slave2这三个字段不是druid的配置项,是我自己定义的,你完全可以起其它名字,比如db1,db2之类的。
image.png
我们需要写一个配置类,来引入我们配置文件的数据库,@ConfigurationProperties注解的参数就是我们配置文件中数据库配置的前缀,而bean注解中的init则是指明了项目启动的时候要初始化连接(去掉init会导致项目启动后不会自动连接数据库,而且等到有第一个sql请求后再连接)
image.png

2.切换数据库源是如何实现的?

还是跟配置类有关,在上一个问题中,我们已经创建了三个DataSource,接下来我们需要创建一个map和数据源绑定起来
image.png
然后作为构造方法参数传入一个继承了AbstractRoutingDataSource的类中,这个类有个determineCurrentLookupKey方法,在这个方法中返回我们上一步设置的key即可使用对应的数据源执行SQL
image.png
所以我们需要在SQL执行前获取到当前希望执行的key,一般是通过ThreadLocal实现的,我们需要当前线程去使用某个库的时候,就调用一下setDataSourceType方法设置key。使用完之后记得清理变量值,防止内存泄露。
image.png

到此我们就基本解决了druid连接池的引入和数据源切换的问题

优化

1.数据源切换方式

代码中调用方法去切换,不够优雅,代码可读性不高,我们可以通过自定义注解实现优雅的切换数据源。代码中我们只要在特定方法上加上@Master或者@Slave注解即可切换数据源
image.png

2.默认主写从读

我是通过mybatis的SQL拦截,拦截所有查询语句,将其数据源设置到从库上
image.png

完整内容,请查看源码:链接


等风来
39 声望5 粉丝