多数据源源路由方案
数据源配置
配置 parentDataSource 的父bean.再配置多个数据源继承这个父bean,对driverClass,url,username,password,等数据源连接参数进行各自的重写。例如 mySqlDataSource ,在 DataSources bean中注入所有要切换的数据源,并且设置默认的数据源。
也可以使用bean的方式进行配置
1 <bean id="parentDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 2 </bean> 3 4 <bean id="mySqlDataSource" parent="parentDataSource"> 5 <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 6 <property name="url" value="jdbc:mysql://localhost:3306/test"></property> 7 <property name="username" value="root"></property> 8 <property name="password" value="root"></property> 9 </bean> 10 11 <bean id="oracleDataSource" parent="parentDataSource"> 12 <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property> 13 <property name="url" value="jdbc:oracle:thin:@10.16.17.40:1531:addb"></property> 14 <property name="username" value="trac"></property> 15 <property name="password" value="trac"></property> 16 </bean> 17 18 <bean id="dataSource" class="com.trac.dao.datasource.DataSources"> 19 <property name="targetDataSources"> 20 <map key-type="java.lang.String"> 21 <entry value-ref="mySqlDataSource" key="MYSQL"></entry> 22 <entry value-ref="oracleDataSource" key="ORACLE"></entry> 23 </map> 24 </property> 25 <property name="defaultTargetDataSource" ref="oracleDataSource"></property> 26 </bean> 27 28 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 29 <property name="dataSource" ref="dataSource" /> 30 </bean> 31 32 <!-- 创建SqlSessionFactory,同时指定数据源和mapper --> 33 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 34 <property name="dataSource" ref="dataSource" /> 35 <property name="mapperLocations" value="classpath*:com/trac/ibatis/dbcp/*.xml" /> 36 </bean> 37 38 <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> 39 <constructor-arg index="0" ref="sqlSessionFactory" /> 40 </bean> 41 42 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 43 <property name="basePackage" value="com.trac.dao" /> 44 </bean>
数据源常量
定义数据源的标识, 和applicationContext.xml中 DataSources 的 targetDataSources 的key对应
1 public class DataSourceInstances{ 2 public static final String MYSQL="MYSQL"; 3 public static final String ORACLE="ORACLE"; 4 }
数据源路由
配置于applicationContext 中,线程局部变量ThreadLocal contextHolder 保存当前需要的数据源类型,当 DataSourceSwitch.setDataSourceType(DataSourceInstances.XXX) 保存当前需要的数据源类型的时候,DataSources 会从当前线程中查找线程变量的数据源类型,从而决定使用何种数据源
1 import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; 2 3 public class DataSources extends AbstractRoutingDataSource{ 4 5 @Override 6 protected Object determineCurrentLookupKey() { 7 return DataSourceSwitch.getDataSourceType(); 8 } 9 10 }
public class DataSourceSwitch{ private static final ThreadLocal contextHolder=new ThreadLocal(); public static void setDataSourceType(String dataSourceType){ contextHolder.set(dataSourceType); } public static String getDataSourceType(){ return (String) contextHolder.get(); } public static void clearDataSourceType(){ contextHolder.remove(); } }
参考: https://www.iteye.com/blog/leoyy-1624704
感谢原作者
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现