本文亮点
目前百度到的整合druid多数据源的文章多是一主一从,也没介绍怎么拓展更多数据源,经过几天摸索,终于搞出了能用的版本。目前有以下几个功能
1.整合druid,实现一主两从架构
2.默认采用主写从读
3.可在代码中通过注解指定读取主库还是从库
本文更多的是对网上现有文章的补充,侧重描述我在摸索过程中的疑难点,具体的知识点之类的,请大家参考下网络上的其它文字。
源代码
先贴出代码地址:链接
两个关键问题
摸索过程中,有两个问题是我比较困惑的
1.数据库是怎么连接上的?
2.切换数据库源是如何实现的?
为了不影响阅读,配置文件和pom依赖放在文末
1.数据库是怎么连接上的?
我是通过配置文件配置的druid,其实master、slave1、slave2这三个字段不是druid的配置项,是我自己定义的,你完全可以起其它名字,比如db1,db2之类的。
我们需要写一个配置类,来引入我们配置文件的数据库,@ConfigurationProperties注解的参数就是我们配置文件中数据库配置的前缀,而bean注解中的init则是指明了项目启动的时候要初始化连接(去掉init会导致项目启动后不会自动连接数据库,而且等到有第一个sql请求后再连接)
2.切换数据库源是如何实现的?
还是跟配置类有关,在上一个问题中,我们已经创建了三个DataSource,接下来我们需要创建一个map和数据源绑定起来
然后作为构造方法参数传入一个继承了AbstractRoutingDataSource的类中,这个类有个determineCurrentLookupKey方法,在这个方法中返回我们上一步设置的key即可使用对应的数据源执行SQL
所以我们需要在SQL执行前获取到当前希望执行的key,一般是通过ThreadLocal实现的,我们需要当前线程去使用某个库的时候,就调用一下setDataSourceType方法设置key。使用完之后记得清理变量值,防止内存泄露。
到此我们就基本解决了druid连接池的引入和数据源切换的问题
优化
1.数据源切换方式
代码中调用方法去切换,不够优雅,代码可读性不高,我们可以通过自定义注解实现优雅的切换数据源。代码中我们只要在特定方法上加上@Master或者@Slave注解即可切换数据源
2.默认主写从读
我是通过mybatis的SQL拦截,拦截所有查询语句,将其数据源设置到从库上
完整内容,请查看源码:链接
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。