这篇文章主要介绍springboot结合mysql主从来实现读写分离的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
1。实现的功能
,,,基于springboot框架,application.yml配置多个数据源,使用AOP以及AbstractRootingDataSource, ThreadLocal来实现多数据源切换,以实现读写分离.mysql的主从数据库需要进行设置数据之间的同步。
2。代码实现
,,,应用程序。属性中的配置
spring.datasource.druid.master.driver-class-name=com.mysql.jdbc.Driver spring.datasource.druid.master.url=jdbc: mysql://127.0.0.1:3306/node2 ? useUnicode=true& characterEncoding=UTF-8& allowMultiQueries=true& autoReconnect=true& useSSL=false spring.datasource.druid.master.username=根 spring.datasource.druid.master.password=123456 , , spring.datasource.druid.slave.driver-class-name=com.mysql.jdbc.Driver spring.datasource.druid.slave.url=jdbc: mysql://127.0.0.1:3306/node1 ? useUnicode=true& characterEncoding=UTF-8& allowMultiQueries=true& autoReconnect=true& useSSL=false spring.datasource.druid.slave.username=根 spring.datasource.druid.slave.password=123456
写一个DataSourceConfig。java来注入两个bean
, @ bean ,,,@ConfigurationProperties (“spring.datasource.druid.master") ,,,public DataSource masterDataSource (), { ,,,,,,,logger.info (“select  master data source"); ,,,,,,,return DruidDataSourceBuilder.create () .build (); ,,,} , ,,@ bean ,,,@ConfigurationProperties (“spring.datasource.druid.slave") ,,,public DataSource slaveDataSource (), { ,,,,,,,logger.info (“select  slave data source"); ,,,,,,,return DruidDataSourceBuilder.create () .build (); ,,,}
写一个枚举来标识有哪些数据源
public enum DBTypeEnum { ,,,,,的奴隶; }
然后写一个ThreadLocal本地线程的管理类,用于设置当前线程是那一个数据源
private static final ThreadLocal, contextHolder =, new ThreadLocal<在(); , ,,,private static final ThreadLocal , contextHolder2 =, ThreadLocal.withInitial ((),→, DBTypeEnum.MASTER); , ,,,public static void 设置(DBTypeEnum dbType), { ,,,,,,,contextHolder.set (dbType); ,,,} , ,,,public static DBTypeEnum 得到(),{ ,,,,,,,return contextHolder.get (); ,,,} , ,,,public static void 主(),{ ,,,,,,,设置(DBTypeEnum.MASTER); ,,,,,,,logger.info(“切换到主数据源“); ,,,} , ,,,public static void 奴隶(),{ ,,,,,,,设置(DBTypeEnum.SLAVE); ,,,,,,,logger.info(“切换到奴隶数据源“); ,,,} , ,,,public static void cleanAll (), { ,,,,,,,contextHolder.remove (); ,,,}
然后写一个DynamicDataSource继承AbstractRootingDataSource,重写它的determineCurrentLookupKey方法。
public class DynamicDataSource extends AbstractRoutingDataSource { ,,,private Logger Logger =, LogManager.getLogger (DynamicDataSource.class); , ,,@Override ,,,protected Object determineCurrentLookupKey (), { ,,,,,,,logger.info(“此时数据源为{},,,DBContextHolder.get ()); ,,,,,,,return DBContextHolder.get (); ,,,} }
最后写一个AOP来实现数据源切换
@Aspect @Order (1) @ component public class  DataSourceAop { , ,,,private Logger Logger =, LogManager.getLogger (DataSourceAop.class); , ,,,@Pointcut(“(执行(*,com.springboot.demo.service . . * .select * (. .)),“, + ,,,,,,,,,,,“| |,执行(*,com.springboot.demo.service . . * * (. .)),“+ ,,,,,,,,,,,“| |,执行(*,com.springboot.demo.service . . * . get * (. .)))“) null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null nullspringboot结合mysql主从来实现读写分离的方法