Java数据源动态切换实现 1 复写JDBC框架数据路由服务package com.datasoure.mybatis; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.annotation.PostConstruct; import javax.sql.DataSource; import org.jboss.logging.Logger; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; import org.springframework.util.CollectionUtils; import com.alibaba.druid.pool.DruidDataSource; import com.common.CommonConstant; import com.datasoure.holder.DynamicDataSourceContextHolder; import com.datasoure.redis.RedisService; import com.utils.JsonUtils; public class DynamicDataSource extends AbstractRoutingDataSource { private static final Logger LOGGER = Logger.getLogger(DynamicDataSource.class); private MapString, DruidDataSource dataSourceMap; @Autowired @Qualifier("dataSourceRedisImpl") private RedisService redisService; @Override protected Object determineCurrentLookupKey() { String dataSourceType = DynamicDataSourceContextHolder.getDataSourceType(); LOGGER.info(String.format("Datasource type is [%s]", dataSourceType)); return dataSourceType; } @PostConstruct public void preUpdate() { updateDataSource(); } public MapString, DruidDataSource getDataSourceMap() { return dataSourceMap; } public void updateDataSource() { MapString, String dataSourceConfigMap = redisService.hgetAll(CommonConstant.REDIS_DATASOURCE_CONFIG_KEY); if (dataSourceConfigMap == null || dataSourceConfigMap.isEmpty()) { LOGGER.info(String.format("DataSource config in redis is empty, redis key is [%s]", CommonConstant.REDIS_DATASOURCE_CONFIG_KEY)); return; } MapObject, Object targetDataSourceMap = new HashMap(dataSourceConfigMap.size()); dataSourceConfigMap.forEach((x, y) - { DataSourceProperty dataSourceProperty = JsonUtils.fromJson(y, DataSourceProperty.class); DataSource dataSource = new DruidDataSource(); BeanUtils.copyProperties(dataSourceProperty, dataSource); targetDataSourceMap.put(x