Spring Boot创建多数据源

本文介绍了在Spring Boot中如何配置主从数据源,并详细讲述了在开发环境中正常运行,但在打包成jar后出现的问题。问题根源在于Mybatis无法扫描到Mapper.xml文件中的别名,解决方案是设置bean.setVfs(SpringBootVFS.class)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • application-dev.yml中配置文件如下:主要配置了主库和从库 直接看代码。

    遇到的问题:1、 eclipse、idea中启动均正常。打成jar启动就报错。
    解决办法:因为Mybatis无法扫描到xxxxMapper.xml中定义的别名。必须设置一下bean.setVfs(SpringBootVFS.class);
     
  
spring: 
  thymeleaf: 
    cache: false
  datasource:
    #主数据库 
    master:
      continueOnError: true
      type: com.alibaba.druid.pool.DruidDataSource
      #主库URL
      url: jdbc:mysql://localhost/master_db?useSSL=false
      username: root
      password: root
      driver-class-name: com.mysql.jdbc.Driver
      initialSize: 5
      minIdle: 5
      maxActive: 20
      maxWait: 60000
      timeBetweenEvictionRunsMillis: 60000
      validationQuery: SELECT 1
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      filters: stat
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    #从库
    slaver:
      continueOnError: true
      type: com.alibaba.druid.pool.DruidDataSource
      url: jdbc:mysql://localhost/slaver?useSSL=false
      username: root
      password: root
      driver-class-name: com.mysql.jdbc.Driver
      initialSize: 5
      minIdle: 5
      maxActive: 20
      maxWait: 60000
      timeBetweenEvictionRunsMillis: 60000
      validationQuery: SELECT 1
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      filters: stat
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000   
  •  主库的配置
    ​
    ​
    
    import javax.sql.DataSource;
    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    
    @Configuration 
    @MapperScan(basePackages = "com.sunxung.factoring.mapper", sqlSessionTemplateRef = "masterSqlSessionTemplate")
    public class MasterDataSourceConfiguration {
    
        @Bean(name = "masterDataSource")
        @ConfigurationProperties(prefix = "spring.datasource.master")
        @Primary
        public DataSource dataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "masterSqlSessionFactory")
        @Primary
        public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setConfiguration(config());
            bean.setTypeAliasesPackage("com.sunxung.factoring.entity");
            // 重点:eclipse、idea中启动均正常。打成jar启动就报错,Mybatis无法扫描到SpringBoot别名
            bean.setVfs(SpringBootVFS.class);
            bean.setMapperLocations(
                    new PathMatchingResourcePatternResolver().getResources("classpath*:/mapper/**/*Mapper.xml"));
            return bean.getObject();
        }
    
        private org.apache.ibatis.session.Configuration config() {
            org.apache.ibatis.session.Configuration config = new org.apache.ibatis.session.Configuration();
            config.setMapUnderscoreToCamelCase(true);
            config.setUseGeneratedKeys(true);
            config.setDefaultFetchSize(100);
            config.setDefaultStatementTimeout(60);
            return config;
        }
    
        @Bean(name = "masterTransactionManager")
        @Primary
        public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    
        @Bean(name = "masterSqlSessionTemplate")
        @Primary
        public SqlSessionTemplate sqlSessionTemplate(
                @Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    }
    
    ​
    
    ​

     

  • slaverDataSourceConfig的配置
     
    
    import javax.sql.DataSource;
    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    
    
    @Configuration
    @MapperScan(basePackages = "com.sunxung.factoring.slavermapper", sqlSessionTemplateRef = "slaverSqlSessionTemplate")
    public class SlaverDataSourceConfiguration {
    
        @Bean(name = "slaverDataSource")
        @ConfigurationProperties(prefix = "spring.datasource.slaver")
        public DataSource dataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "slaverSqlSessionFactory")
        public SqlSessionFactory sqlSessionFactory(@Qualifier("slaverDataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setConfiguration(config());
            bean.setTypeAliasesPackage("com.sunxung.factoring.entity");
            bean.setVfs(SpringBootVFS.class);
            bean.setMapperLocations(
                    new PathMatchingResourcePatternResolver().getResources("classpath*:/slavermapper/**/*Mapper.xml"));
            return bean.getObject();
        }
    
        private org.apache.ibatis.session.Configuration config() {
            org.apache.ibatis.session.Configuration config = new org.apache.ibatis.session.Configuration();
            config.setMapUnderscoreToCamelCase(true);
            config.setUseGeneratedKeys(true);
            config.setDefaultFetchSize(100);
            config.setDefaultStatementTimeout(60);
            return config;
        }
    
        @Bean(name = "slaverTransactionManager")
        public DataSourceTransactionManager transactionManager(@Qualifier("slaverDataSource") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    
        @Bean(name = "slaverSqlSessionTemplate")
        public SqlSessionTemplate sqlSessionTemplate(
                @Qualifier("slaverSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    }
    

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值