Spring Boot
MySQL
MyBatis
这篇文章要结合以下文章来看:
先多说几句。
一般中小型的项目,搞个1主多从就可以了,如果对高可用有要求,双主多从就够够的了。这时候结合我们的工程,完全就可以搞读写分离了,就是配置多个数据源,调用Dao或Mapper的时候走不同的数据源连接而已。
大家一般使用读写分离的时候,MySQL可能更多是用MySQL Proxy或者MyCat。
但是MySQL Proxy这个组件啊,怎么说它呢,大家可以去看官网,这个组件就从来没有发布过正式版,全是Alpha,官方自己都不建议用,也是奇葩了。
而MyCat呢,功能又太强大。满汉全席虽然好,但是我就是想吃个红柳烤串而已。MySQL Router够用了。
读写分离其实不用MySQL Router也行,但是它还有高可用、负载均衡的功能,就省了我们在代码里实现了。大家可以进行测试,本文就不测试了。
另外MySQL Router实现了MySQL的高可用,它自己的高可用可以使用Keepalived,有关KA的使用可以参考《Keepalived+Nginx高可用安装部署(含Nginx+Tomcat负载均衡)》
以上应该写在上一篇的,当时时间紧,就挪到这里吧。
配置
appliction.yml
很简单,就是配两个数据源,一读一写。我使用的是Druid,用的是最简单的配置,具体的配置项大家可以看DruidAbstractDataSource这个类。
接着是一些配置类,一个个来:
DBCfg,根据配置文件配置数据源:
DBCfg
枚举的数据连接类型:
DBEnums
数据源动态切换:
DataSourceContextHolder
数据库路由
RouteDB
如果我们不是用MySQL Router,而是配置了多个从库的话,这里应该做一些处理,写个轮询、随机访问之类的规则。不过负载的事由MySQL Router做了,这里就不用制定规则了。
MyBatis的配置,这里放在了Spring Boot的启动类里,实际工作中应该单写一个类比较合适:
MyBatis配置
事务配置:
DBTXCfg
数据库连接切换AOP,切换是放在Service里:
DBAop
至此,读写分离就完成了。