spring boot 配置双数据源

  • yml 数据源配置
spring:
  datasource_1:
    driver-class-name: com.mysql.jdbc.Driver
    #数据库连接配置
    url: 数据库连接
    username: root
    password: password
  datasource_2:
    driver-class-name: com.mysql.jdbc.Driver
    url: 数据库连接
    username: root
    password: 
  • 项目结构

    dao层 需要使用两个包,一个是主数据源,一个副数据源

    mapper 也需要有两个文件夹 来存放xml 文件

  • 主要配置代码

    • 主数据源 master
    @Configuration
    @MapperScan(basePackages = MasterSourceConfig.PACKAGE_PATH,sqlSessionFactoryRef = "masterSqlSessionFactory")
    public class MasterSourceConfig {
    
        static final String PACKAGE_PATH="com.demo.dao.master";
        static final String MAPPER_LOCATION="classpath*:mapper/master/*.xml";
        @Value("${spring.datasource_1.url}")
        private String url;
        @Value("${spring.datasource_1.username}")
        private String userName;
        @Value("${spring.datasource_1.password}")
        private String password;
        @Value("${spring.datasource_1.driver-class-name}")
        private String driverClass;
        
        @Bean(name = "masterDataSource")
        @Primary
        public DataSource dataSource(){
    //        HikariDataSource hikariDataSource =new HikariDataSource();
    //        hikariDataSource.setDriverClassName(driverClass);
    //        hikariDataSource.setJdbcUrl(url1);
    //        hikariDataSource.setUsername(userName);
    //        hikariDataSource.setPassword(password);
    //使用druid 连接池
            DruidDataSource druidDataSource =new DruidDataSource();
            druidDataSource.setDriverClassName(driverClass);
            druidDataSource.setUrl(url);
            druidDataSource.setUsername(userName);
            druidDataSource.setPassword(password);
            return druidDataSource;
        }
    
        @Bean(name="masterTransactionManager")
        @Primary
        public DataSourceTransactionManager masterTransactionManager(){
            return new DataSourceTransactionManager(dataSource());
        }
    
    
        @Bean(name = "masterSqlSessionFactory")
        @Primary
        public SqlSessionFactory sqlSessionFactory (@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean sessionFactoryBean =new SqlSessionFactoryBean();
            org.apache.ibatis.session.Configuration configuration =new org.apache.ibatis.session.Configuration();
            //将mysql 中表的下滑线字段映射称驼峰字段
            configuration.setMapUnderscoreToCamelCase(true);
            sessionFactoryBean.setConfiguration(configuration);
            sessionFactoryBean.setDataSource(dataSource);
            sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MasterSourceConfig.MAPPER_LOCATION));
    
            return sessionFactoryBean.getObject();
        }
    
    • 副数据源 second
    @Configuration
    @MapperScan(basePackages = SecondSourceConfig.PACKAGE_PATH,sqlSessionFactoryRef = "secondSqlSessionFactory")
    public class SecondSourceConfig {
    
        static final String PACKAGE_PATH="com.demo.dao.second";
    
        static final String MAPPER_PATH="classpath*:mapper/second/*.xml";
    
        @Value("${spring.datasource_2.url}")
        private String url;
        @Value("${spring.datasource_2.username}")
        private String userName;
        @Value("${spring.datasource_2.password}")
        private String password;
        @Value("${spring.datasource_2.driver-class-name}")
        private String driverClass;
    
        @Bean(name = "secondDataSource")
        public DataSource secondDataSource(){
            DruidDataSource druidDataSource =new DruidDataSource();
            druidDataSource.setDriverClassName(driverClass);
            druidDataSource.setUrl(url);
            druidDataSource.setUsername(userName);
            druidDataSource.setPassword(password);
            return druidDataSource;
        }
    
        @Bean(name = "secondTransactionManager")
        public DataSourceTransactionManager secondTransactionManager(){
            return new DataSourceTransactionManager(secondDataSource());
        }
    
    
        @Bean(name = "secondSqlSessionFactory")
        public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("secondDataSource") DataSource clusterDataSource)
                throws Exception {
            final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
            sessionFactory.setDataSource(clusterDataSource);
            sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                    .getResources(SecondSourceConfig.MAPPER_PATH));
            return sessionFactory.getObject();
        }
    
    }
    
  • 启动类需要禁止一些类自动注入

    @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, JdbcTemplateAutoConfiguration.class,})
    
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐