• SpingBoot整合多数据源连接


    1、多数据源连接的两种方式:分包||注解;

    分包:通过包名指定连接那个数据源;

    application.properties配置

    ###datasource1
    spring.datasource.test1.driver-class-name = com.mysql.jdbc.Driver
    spring.datasource.test1.jdbc-url = jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
    spring.datasource.test1.username = root
    spring.datasource.test1.password = root
    ###datasource2
    spring.datasource.test2.driver-class-name = com.mysql.jdbc.Driver
    spring.datasource.test2.jdbc-url = jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8
    spring.datasource.test2.username = root
    spring.datasource.test2.password = root

    配置文件中新增两个数据源

    //DataSource01
    @Configuration // 注册到springboot容器中
    @MapperScan(basePackages = "com.itmayiedu.test01", sqlSessionFactoryRef = "test1SqlSessionFactory")
    public class DataSource1Config {
    
        /**
         * @methodDesc: 功能描述:(配置test1数据库)*/
        @Bean(name = "test1DataSource")
        @ConfigurationProperties(prefix = "spring.datasource.test1")
        @Primary
        public DataSource testDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        /**
         * @methodDesc: 功能描述:(test1 sql会话工厂)*/
        @Bean(name = "test1SqlSessionFactory")
        @Primary
        public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource)
                throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            // bean.setMapperLocations(
            // new
            // PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
            return bean.getObject();
        }
    
        /**
         * @methodDesc: 功能描述:(test1 事物管理)*/
        @Bean(name = "test1TransactionManager")
        @Primary
        public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    
        @Bean(name = "test1SqlSessionTemplate")
        @Primary
        public SqlSessionTemplate testSqlSessionTemplate(
                @Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    
    }
    
    
    //DataSource2
    @Configuration // 注册到springboot容器中
    @MapperScan(basePackages = "com.itmayiedu.test02", sqlSessionFactoryRef = "test2SqlSessionFactory")
    public class DataSource2Config {
    
        /**
         * @methodDesc: 功能描述:(配置test2数据库)*/
        @Bean(name = "test2DataSource")
        @ConfigurationProperties(prefix = "spring.datasource.test2")
        public DataSource testDataSource() {
            return DataSourceBuilder.create().build();
        }
    
        /**
         * 
         * @methodDesc: 功能描述:(test2 sql会话工厂)*/
        @Bean(name = "test2SqlSessionFactory")
        public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource)
                throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            // bean.setMapperLocations(
            // new
            // PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test2/*.xml"));
            return bean.getObject();
        }
    
        /**
         * @methodDesc: 功能描述:(test2 事物管理)*/
        @Bean(name = "test2TransactionManager")
        public DataSourceTransactionManager testTransactionManager(@Qualifier("test2DataSource") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    
        @Bean(name = "test2SqlSessionTemplate")
        public SqlSessionTemplate testSqlSessionTemplate(
                @Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    
    }

    多数源事务注意:

    在多数据源的情况下,使用@Transactional注解时,应该指定事务管理者

    Springboot1.5的时候 没有默认指向数据源 会报错

    Springboot2.0的时候 不报错

    @Transactional(transactionManager = "test2TransactionManager")

    注解原理:通过AOP技术拦截,手写注解,当传递的参数是DataSource1则获取DataSource1的连接;同理其他数据源;【比较麻烦,当工程较大时,方法较多使用的注解也多,容易忘掉;推荐分包方式】

  • 相关阅读:
    使用PowerShell脚本来轮训Exchange数据库的状态
    使用NUnit在.Net编程中进行单元测试【转载】
    利用NUnit对类、方法进行原子级测试
    单元测试的重要性
    不用临时变量,只用11个字符交换两个变量的值——窥视C#编译原理的冰山一角
    博客园
    c++的float(NaN)
    mysql之innodb的锁分类
    配置alchemc时cygwin下面,特别要注意路径
    关于异步调用Discuz!NT接口
  • 原文地址:https://www.cnblogs.com/yuhuiqing/p/10701881.html
Copyright © 2020-2023  润新知