Springboot配置双数据源

1. 多数据源的配置文件,采用application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    jdbc-url: jdbc:mysql://xx.xx.xx.xx:32306/xx-db?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: p@ssw0rd
    hikari:
      minimum-idle: 10
      maximum-pool-size: 40
  datasource-access:
    driver-class-name: com.mysql.cj.jdbc.Driver
    jdbc-url: jdbc:mysql://xx.xx.xx.xx:32306/xx-db2?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: p@ssw0rd
    hikari:
      minimum-idle: 10
      maximum-pool-size: 40

2. 多数据源的配置JAVA文件

@Configuration
#xx.xx.mapper.access 包下的Mapper接口
@MapperScan(basePackages = {"xx.xx.mapper.access"}, sqlSessionFactoryRef = "accessSqlSessionFactory")
public class SqlSessionFactoryAccessConfig {
    static final String MAPPER_LOCATION = "classpath:mapper/access/*.xml";

    /**
     * 配置数据源
     */
    @Bean(name = "dataSourceAccess")
    @ConfigurationProperties(prefix = "spring.datasource-access")
    public DataSource dataSourceAccess() {
        return DataSourceBuilder.create().build();
    }


    /**
     * 配置SqlSessionFactory
     */
    @Bean(name = "accessSqlSessionFactory")
    public SqlSessionFactory accessSqlSessionFactory(@Qualifier("dataSourceAccess") DataSource dataSource) throws Exception {
//        final SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        //用这个MybatisSqlSessionFactoryBean是因为我用的是mybatis普拉斯 用上面的会报错
        MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
        mybatisConfiguration.setDefaultEnumTypeHandler(CoreEnumTypeHandler.class);
        mybatisConfiguration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class);
        mybatisConfiguration.setMapUnderscoreToCamelCase(true);
        mybatisConfiguration.setCacheEnabled(false);
        final MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setConfiguration(mybatisConfiguration);
        //这里注意getResources()方法,一定要加s因为有一个方法是getResource()
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        sqlSessionFactoryBean.setPlugins(mybatisPlusInterceptor);
        return sqlSessionFactoryBean.getObject();
    }
}

@Configuration
@MapperScan(basePackages = {"xx.xx.mapper.video"}, sqlSessionFactoryRef = "videoSqlSessionFactory")
public class SqlSessionFactoryVideoConfig {
    static final String MAPPER_LOCATION = "classpath:mapper/*.xml";

    /**
     * 配置数据源
     */
    @Bean(name = "dataSourceVideo")
    @ConfigurationProperties(prefix = "spring.datasource")
    @Primary
    public DataSource dataSourceVideo() {
        return DataSourceBuilder.create().build();
    }

    /**
     * 配置SqlSessionFactory
     */
    @Bean(name = "videoSqlSessionFactory")
    @Primary
    public SqlSessionFactory videoSqlSessionFactory(@Qualifier("dataSourceVideo") DataSource dataSource) throws Exception {
//        final SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        //用这个MybatisSqlSessionFactoryBean是因为我用的是mybatis普拉斯 用上面的会报错
        final MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
        mybatisConfiguration.setDefaultEnumTypeHandler(CoreEnumTypeHandler.class);
        mybatisConfiguration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class);
        mybatisConfiguration.setMapUnderscoreToCamelCase(true);
        mybatisConfiguration.setCacheEnabled(false);
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setConfiguration(mybatisConfiguration);
        //这里注意getResources()方法,一定要加s因为有一个方法是getResource()
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        sqlSessionFactoryBean.setPlugins(mybatisPlusInterceptor);
        return sqlSessionFactoryBean.getObject();
    }
}

注意:jdbc-url 和 url的区别。
当我们通过DataSourceProperties方式注入数据源配置,获取DataSource时,这个时候需要使用url
如果是直接通过配置获取DataSource,那必须是jdbc-url。
如果是单数据源,非手动获取配置注入数据源的不考虑该问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是配置数据源的步骤: 1. 在pom.xml文件中添加druid和jdbc依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.16</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> ``` 2. 在application.yml文件中配置数据源信息(例如:db1和db2): ```yml spring: datasource: db1: url: jdbc:mysql://localhost:3306/test1?characterEncoding=utf8&useSSL=false&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.jdbc.Driver db2: url: jdbc:mysql://localhost:3306/test2?characterEncoding=utf8&useSSL=false&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.jdbc.Driver ``` 3. 在代码中配置数据源和事务管理器: ```java @Configuration public class DataSourceConfig { @Bean(name = "db1DataSource") @ConfigurationProperties(prefix = "spring.datasource.db1") public DataSource db1DataSource() { return DruidDataSourceBuilder.create().build(); } @Bean(name = "db2DataSource") @ConfigurationProperties(prefix = "spring.datasource.db2") public DataSource db2DataSource() { return DruidDataSourceBuilder.create().build(); } @Bean(name = "dynamicDataSource") public DynamicDataSource dynamicDataSource(@Qualifier("db1DataSource") DataSource db1DataSource, @Qualifier("db2DataSource") DataSource db2DataSource) { Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put(DataSourceType.DB1, db1DataSource); targetDataSources.put(DataSourceType.DB2, db2DataSource); DynamicDataSource dynamicDataSource = new DynamicDataSource(); dynamicDataSource.setTargetDataSources(targetDataSources); dynamicDataSource.setDefaultTargetDataSource(db1DataSource); return dynamicDataSource; } @Bean public PlatformTransactionManager transactionManager(DynamicDataSource dataSource) { return new DataSourceTransactionManager(dataSource); } } ``` 4. 在代码中根据需要动态切换数据源: ```java @Service public class UserService { @Autowired private UserMapper userMapper; @Transactional public void addUser(User user) { DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.DB1); userMapper.addUser(user); DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.DB2); userMapper.addUser(user); } public List<User> getUsers() { DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.DB1); List<User> userList1 = userMapper.getUsers(); DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.DB2); List<User> userList2 = userMapper.getUsers(); List<User> userList = new ArrayList<>(); userList.addAll(userList1); userList.addAll(userList2); return userList; } } ``` 以上就是配置数据源的步骤,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值