3.但是发现新增数据源或修改数据源时无法操作,需要重启服务,后面发现DynamicDataSource中有一个Map变量用于存储数据源,在调用其构造函数时候有进行加载 ? ? ?
"); dynamicDataSource.setUsername(dbuser); dynamicDataSource.setUrl(url...); dynamicDataSource.setPassword(dbpwd); dynamicDataSource.setInitialSize...(50); dynamicDataSource.setMinIdle(5); dynamicDataSource.setMaxActive...dynamicDataSource.setRemoveAbandoned(true); dynamicDataSource.setRemoveAbandonedTimeout...dataSourceMap.put(key + "master", dynamicDataSource); DynamicDataSource.getInstance(
这里的路由key 对应其实是resolvedDataSources Map 的key哟 @Slf4j public class DynamicDataSource extends AbstractRoutingDataSource...") public DynamicDataSource dataSource() { JdbcTemplate(dds).queryForList(DataSourceConstant.QUERY_DS_SQL...ds = new DynamicDataSource(); ds.setTargetDataSources(dataSourceMap); return ds; } @Bean public...那我们只要获取当前的DynamicDataSource bean 手动调用afterPropertiesSet 即可。...") public DynamicDataSource dataSource() { DynamicDataSource ds = new DynamicDataSource(); HikariDataSource
(二)自定义DynamicDataSource 自定义DynamicDataSource继承 AbstractRoutingDataSource,由上得知,我们先要有个方法能设置 targetDataSources...") public DataSource dynamicDataSource() { DynamicDataSource dynamicDataSource = new DynamicDataSource...(master()); // 将 master 和 slave 数据源作为指定的数据源 dynamicDataSource.setDataSources(dataSourceMap...()); 配置事务管理器,并将动态数据源注入new DataSourceTransactionManager(dynamicDataSource()); 注意事项: 此处还有一点容易出错,就是分页问题,...dynamicDataSource = (DynamicDataSource)ApplicationContextProvider.getBean("dynamicDataSource");
创建我们自己的数据源DynamicDataSource继承AbstractRoutingDataSource,实现它的抽象方法determineCurrentLookupKey,这个方法其实就是实现动态选择数据源的关键...import java.util.HashMap; import java.util.Map; /** * @author walking * 公众号:编程大道 */ public class DynamicDataSource...Objects.isNull(datasourceName)) { DynamicDataSource.setDataSourceName(datasourceName);...dynamicDataSource = new DynamicDataSource(firstDataSource, targetDataSources); dynamicDataSource.setPackageDatasource...(packageDataSource); dynamicDataSource.afterPropertiesSet(); return dynamicDataSource
这里用到了Spring Boot + Mybatis + DynamicDataSource配置动态双数据源,可以动态切换数据源实现数据库的读写分离。...dynamicDataSource = new DynamicDataSource(); dynamicDataSource.setDefaultTargetDataSource(master...); dynamicDataSource.setTargetDataSources(dsMap); return dynamicDataSource; }...@Bean public PlatformTransactionManager transactionManager(DynamicDataSource dynamicDataSource) {...sqlSessionFactory(DynamicDataSource dynamicDataSource) throws Exception { SqlSessionFactoryBean
blog.csdn.net/u013360850/article/details/78861442 作者:呜呜呜啦啦啦 项目地址: https://github.com/helloworlde/SpringBoot-DynamicDataSource...") public DataSource dynamicDataSource() { DynamicRoutingDataSource dynamicRoutingDataSource = new...; import cn.com.hellowood.dynamicdatasource.common.CommonResponse; import cn.com.hellowood.dynamicdatasource.common.ResponseUtil...; import cn.com.hellowood.dynamicdatasource.modal.Product; import cn.com.hellowood.dynamicdatasource.service.ProductService...; import cn.com.hellowood.dynamicdatasource.mapper.ProductDao; import cn.com.hellowood.dynamicdatasource.modal.Product
通过注入一个新的DataSourceTransactionManager 实现,并且给它设置多个 DataSource 来实现多数据源实现 [20190411214852_Sg85cY_DynamicDataSource.jpeg...@Slf4j public class DynamicDataSource extends AbstractRoutingDataSource { /** * 指定路由Key,这里很简单 获取...") public DynamicDataSource dataSource() { JdbcTemplate(dds).queryForList(DataSourceConstant.QUERY_DS_SQL...ds = new DynamicDataSource(); ds.setTargetDataSources(dataSourceMap); return ds; } @Bean public...") public DynamicDataSource dataSource() { DynamicDataSource ds = new DynamicDataSource(); HikariDataSource
ApplicationContext context; @ApolloConfig Config config; @Bean("dataSource") public DynamicDataSource...dynamicDataSource() { DynamicDataSource source = new DynamicDataSource(); source.setTargetDataSources...changeEvent.changedKeys(); if (changedKeys.contains("spring.datasource.url")) { DynamicDataSource...source = context.getBean(DynamicDataSource.class); source.setTargetDataSources(Collections.singletonMap...dataSource.setPassword(config.getProperty("spring.datasource.password", "")); return dataSource; } class DynamicDataSource
extends AbstractRoutingDataSource { public DynamicDataSource(DataSource defaultDataSource,Map<Object...(defaultDataSource,dataSourceMap); } } 通过配置类,将配置文件中的配置的数据库信息转换成datasource,并添加到DynamicDataSource中...,同时通过@Bean将DynamicDataSource注入Spring中进行管理,后期在进行动态数据源添加时,会用到。...(){} @Around("dynamicDataSource()") public Object datasourceAround(ProceedingJoinPoint point...因此我们需要改造下DynamicDataSource来实现动态加载数据源。
在spring的配置DynamicDataSource时,需要指定targetDataSources,这就是目标数据源集,是一个map,key就是通过targetDataSources获得对应的数据源。...public class DynamicDataSource extends AbstractRoutingDataSource { public static ThreadLocal key...public Column selectOne(int id) { DynamicDataSource.key.set("cms"); Column col =mapper.selectOne...= null) { DynamicDataSource.key.set(anno.value()); } else { String key...public void after(JoinPoint jp) throws Throwable{ DynamicDataSource.key.remove(); } } 添加注解
org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; /** * 获取本地数据源 */ public class DynamicDataSource...} /** * 动态数据源: 通过AOP在不同数据源之间动态切换 * @return */ @Primary @Bean(name = "dynamicDataSource...") public DataSource dynamicDataSource() { DynamicDataSource dynamicDataSource = new DynamicDataSource...(); // 默认数据源 dynamicDataSource.setDefaultTargetDataSource(dataSource1()); //...(dsMap); return dynamicDataSource; } /** * 配置@Transactional注解事物 * @return
){ return DruidDataSourceBuilder.create().build(); } @Bean @Primary public DynamicDataSource...xiaobinMasterDataSource); targetDataSources.put("xiaobin-slave", xiaobinSlaveDataSource); return new DynamicDataSource...(xiaobinMasterDataSource, targetDataSources); } } 动态数据源切换类 public class DynamicDataSource extends...("xiaobin-master"); }else { DynamicDataSource.setDataSource(dataSource.name());...} try { return point.proceed(); } finally { DynamicDataSource.clearDataSource
,所以在事物中每次我们获取connection依据就是DynamicDataSource这个对象作为key,所以每次都会一样了!!...JdbcTemplate jdbcTemplate = null; try{ jdbcTemplate = new JdbcTemplate(dynamicDataSource...dynamicDataSource; private ConcurrentHashMap dataSources; private ConcurrentHashMap...= (DynamicDataSource) dataSource; dataSources = new ConcurrentHashMap(); connections...dataSources.containsKey(dataBaseID)) { DataSource dataSource = dynamicDataSource.getAcuallyDataSource
()) .password(db2Config.getPassword()).type(HikariDataSource.class).build(); } @Bean public DynamicDataSource...map.put(DataSourceTypeEnum.DB1, db1DataSource); map.put(DataSourceTypeEnum.DB2, db2DataSource); DynamicDataSource...dynamicDataSource = new DynamicDataSource(); dynamicDataSource.setTargetDataSources(map); dynamicDataSource.setDefaultTargetDataSource...(db1DataSource); return dynamicDataSource; } @Bean public MybatisSqlSessionFactoryBean sqlSessionFactoryBean...dynamicDataSource) { return new DataSourceTransactionManager(dynamicDataSource); } } 实体类,Mapper,
肯定是从 DynamicDataSource 来,因为我们给事务管理器配置的就是它 @Bean public PlatformTransactionManager transactionManager...(@Qualifier("dynamicDataSource") DataSource dynamicDataSource) { // 配置事务管理, 使用事务时在方法头部添加@Transactional...注解即可 return new DataSourceTransactionManager(dynamicDataSource); } 既然是从 DynamicDataSource...获取的 Connection,那 DynamicDataSource 根据 lookupKey 获取 Connection 的时候,会从 masterDataSource 数据源获取还是从 slaveDataSource...因为此时还未将 lookupKey 绑定到当前线程,那么 DynamicDataSource 会从默认数据源获取,而我们配置的默认数据源是 slaveDataSource /** *
DataSource db2, @Qualifier("db3") DataSource db3) { DynamicDataSource...dynamicDataSource = new DynamicDataSource(); Map targetDataSources = new HashMap...DBTypeEnum.db2.getValue(), db2); targetDataSources.put(DBTypeEnum.db3.getValue(), db3); dynamicDataSource.setTargetDataSources...(targetDataSources); dynamicDataSource.setDefaultTargetDataSource(db2); return dynamicDataSource...com.df.openapi.config.db; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class DynamicDataSource
领取专属 10元无门槛券
手把手带您无忧上云