介绍
这篇文章给大家介绍如何将弹簧的动态数据源进行读写分离,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
一、创建基于ThreadLocal的动态数据源容器,保证数据源的线程安全性
package com.bounter.mybatis.extension;/* * ,*基于ThreadLocal实现的动态数据源容器,保证DynamicDataSource的线程安全性 ,* @author 西蒙 ,* ,*/public class  DynamicDataSourceHolder { ,private static  final ThreadLocal< String>, dataSourceHolder =, new ThreadLocal<在(); ,public static  void setDataSource (String dataSourceKey), { ,dataSourceHolder.set (dataSourceKey); ,} ,public static String  getDataSource (), { ,return dataSourceHolder.get (); ,} ,public static void  clearDataSource (), { ,dataSourceHolder.remove (); ,} }
二、定义弹簧动态数据源扩展类,用来实现主人,奴隶数据源动态切换
package com.bounter.mybatis.extension; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;/* * ,*自定义的Spring 动态数据源扩展类,用来实现主人,奴隶数据源动态切换 ,* @author 西蒙 ,* ,*/public class  DynamicDataSource extends AbstractRoutingDataSource  { ,@Override ,protected Object  determineCurrentLookupKey (), { ,//使用DynamicDataSourceHolder保证线程安全 ,return DynamicDataSourceHolder.getDataSource (); ,} }
三,配置主人,奴隶数据源
1。db。属性配置主、从数据信息
#, Master DB db.master.url=jdbc: mysql://192.168.168.110:3306/邦德? useUnicode=true& characterEncoding=utf8& zeroDateTimeBehavior=convertToNull& allowMultiQueries=true& serverTimezone=PRC& useSSL=false db.master.username=邦德 #,AES 加密,Base64 编码 db.master.password=ZNhnEjauk3pecZxxS84ofA==#,Slave DB db.slave.url=jdbc: mysql://192.168.168.111:3306/数据库? useUnicode=true& characterEncoding=utf8& zeroDateTimeBehavior=convertToNull& allowMultiQueries=true& serverTimezone=PRC& useSSL=false db.slave.username=邦德 #,AES 加密,Base64 编码 db.slave.password=jFYmt2f57RHhzItYDhWiSA==
2。春天配置文件配置主、从连接池,动态数据源
& lt; !——,掌握数据源,——比; & lt; bean id=癿asterDataSource",类=癱om.alibaba.druid.pool.DruidDataSource" init方法=癷nit"大敌;销毁方法=癱lose"比; ,& lt; !——,基本属性,url,用户,password ——比; ,& lt; property name=皍rl",价值=https://www.yisu.com/zixun/" $ {db.master.url} "/> <属性名="用户名" value=" $ {db.master。用户名}"/> <属性名==" $ {db.master“密码”价值。密码}"/> <属性名=" initialSize " value=" 20 "/> <属性名=" minIdle " value=" 1 "/> <属性名=" maxActive " value=" 40 "/> <属性名=" maxWait " value=" 60000 "/> <属性名=" timeBetweenEvictionRunsMillis " value=" 60000 "/> <属性名=" minEvictableIdleTimeMillis " value=" 300000 "/> <属性名=" validationQuery " value="选择“x”"/> <属性名=" testWhileIdle " value=" true "/> <属性名=" testOnBorrow " value=" false "/> <属性名=" testOnReturn " value=" false "/> <属性名="过滤器" value="统计"/> 豆><属性名="用户名" value=" $ {db.slave。用户名}"/> <属性名==" $ {db.slave“密码”价值。密码}"/> <属性名=" initialSize " value=" 20 "/> <属性名=" minIdle " value=" 1 "/> <属性名=" maxActive " value=" 40 "/> 如何将弹簧的动态数据源进行读写分离