• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

DynamicRoutingDataSource dynamic-datasource 多数据源动态加载、切换

武飞扬头像
JAVA_XJN
帮助1

项目启动时,动态 、循环将所有的数据源加入DynamicRoutingDataSource中

# 数据源
spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/master?useUnicode=true&characterEncoding=utf-8
          username: root
          password: root
          driver-class-name: com.mysql.jdbc.Driver 
# mybatis配置
mybatis:
  mapper-locations: classpath:mapper/*.xml    # mapper映射文件位置
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl   #用于控制台打印sql语句
logging:
  level:
    org.springframework.web: debug
    cn.zifangsky: debug
  file:
    name: web-exercise.log
    path: logs
学新通
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.x.program.service.XjnService;
import com.x.program.util.InitDBUTil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @author Xjn
 * @create 2023-02-20 17:09
 *
 */
@Component
public class DynamicDatasourceConfig {

    private Logger logger = LoggerFactory.getLogger(DynamicDatasourceConfig.class);

    private Map<String,String> hospitalTable = new HashMap();

    @Resource
    private XService xService;

    @Resource
    private DynamicRoutingDataSource dataSource;

    /**
     * 初始化加载所有的医院
     */
    @PostConstruct
    public void loadAllDB(){
        hospitalTable.put("master","管理中心");
        //查询所有已经建库的医院
        List<Map<Object, String>> AllDB =xService.findAllDB();
        for (Map map : AllDB) {
            DruidDataSource tmpdb = InitDBUTil.getInitDBConfig();
            tmpdb.setUsername(map.get("username").toString());
            tmpdb.setPassword(map.get("password").toString());
            tmpdb.setUrl("jdbc:mysql://" map.get("mysqlSchema") "/" map.get("mysqlurl") "?useUnicode=true&characterEncoding=utf-8");
            tmpdb.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.addDataSource(map.get("mysqlurl").toString(),tmpdb);
            logger.info("====加载动态数据库完成,mysqlSchema=" map.get("mysqlSchema").toString());
            hospitalTable.put(map.get("mysqlSchema").toString(),map.get("hosplitalName").toString());
        }

        DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource;
        logger.info("==已连接的数据源==" ds.getDataSources().keySet());
    }

}
学新通
public class InitDBUTil {
    public static DruidDataSource getInitDBConfig(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setInitialSize(5);
        dataSource.setMaxActive(20);
        dataSource.setMinIdle(5);
        dataSource.setMaxWait(6000);
        dataSource.setTimeBetweenEvictionRunsMillis(60000);
        dataSource.setMinEvictableIdleTimeMillis(300000);
        dataSource.setValidationQuery("select 1 from dual");
        dataSource.setTestWhileIdle(true);
        dataSource.setTestOnBorrow(false);
        dataSource.setTestOnReturn(false);
        dataSource.setPoolPreparedStatements(true);
        dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
        return dataSource;
    }
}
学新通
@Service
public class XServiceImpl implements XService {

    @Autowired
    XMapper xMapper;


    @Override
    @DS("#header.tenantName")//从header获取需要查询库名
    public List<Map> findMessage() {

        return xMapper.findMessage();
    }

    @Override
    public List<Map<Object, String>> findAllDB() {

        return xMapper.findAllDB();
    }
}
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgcafic
系列文章
更多 icon
同类精品
更多 icon
继续加载