分享

SpringBoot + Mybatis 多数据源配置

 三十的狼 2020-04-04

目录

 

一、禁掉SpringBoot的自动配置数据源类,并写新的配置类

二、自动切换数据源

三、重写SpringBoot的数据源配置

四、数据源配置类的整合代码


       在实际中,一个项目一般只会对应着一个数据源,但也有些需要多个数据源的项目。在本文中,会介绍SpringBoot + Mybatis框架下如何配置多个数据源,并能代码中自主切换。

一、禁掉SpringBoot的自动配置数据源类,并写新的配置类

       在SpringBoot中,程序会自动读取src/main/resources/application.properties文件中的spring.datasource.xxx的数据源配置信息,所以我们需要配置多数据源的话,要先把这个自动读取数据源配置信息的类禁掉。禁掉该类的方法是:在SpringBoot的启动类中,使用@SpringBootApplication注解时把该类(DataSourceAutoConfiguration.class)排除。代码如下:

  1. /**
  2.  * SpringBoot启动程序
  3.  *
  4.  * @author hrc
  5.  * @date 2018年10月9日
  6.  */
  7. @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) // 禁掉
  8. @EnableAutoConfiguration
  9. @MapperScan("com.zldc.weekly.mapper")
  10. public class StarApp extends SpringBootServletInitializer {
  11.    @Override
  12.    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
  13.       return builder.sources(StarApp.class);
  14.    }
  15.    public static void main(String[] args) {
  16.       SpringApplication.run(StarApp.class, args);
  17.    }
  18. }

       禁掉自动读取数据源配置类之后,需要自己写读取不同数据源的配置信息代码了,要配置多少个数据源,就多少个配置方法,相关代码如下:

  1. /**
  2.     * mysql数据源
  3.     * @return
  4.     */
  5.    @Bean("mysql") // bean的名称
  6.     @ConfigurationProperties(prefix = "spring.datasource.mysql") // application.properteis中对应属性的前缀
  7.    public DataSource mysqlDataSource() {
  8.         return DataSourceBuilder.create().build();
  9.     }
  10.    /**
  11.     * oracle数据源
  12.     * @return
  13.     */
  14.    @Bean("oracle") // bean的名称
  15.     @ConfigurationProperties(prefix = "spring.datasource.oracle") // application.properteis中对应属性的前缀
  16.    public DataSource oracleDataSource() {
  17.         return DataSourceBuilder.create().build();
  18.     }

 

二、自动切换数据源

         数据源类型常量类(也可以是枚举类),具体代码如下:

  1. /**
  2.  * 数据源名称
  3.  *
  4.  * @author hrc
  5.  * @date 2018年10月9日
  6.  */
  7. public class DataSourceDialect {
  8.    public static final String ORACLE="oracle";
  9.    public static final String MYSQL="mysql"; 
  10. }

       数据源切换类,构建一个数据源类型容器,并提供了向其中设置、获取和清空数据源类型的方法,具体代码如下:

  1. /**
  2.  * 数据源类型容器
  3.  *
  4.  * @author hrc
  5.  * @date 2018年10月9日
  6.  */
  7. public class DataSourceSwitch {
  8.    /**
  9.     * 保存数据源类型线程安全容器
  10.     */
  11.    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
  12.    /**
  13.     * 设置数据源类型
  14.     * @param dataSourceType  数据源类型
  15.     */
  16.    public static void setDataSourceType (String dataSourceType) {
  17.       contextHolder.set(dataSourceType);
  18.    }
  19.    /**
  20.     * 获取数据源类型
  21.     * @return
  22.     */
  23.    public static String getDataSourceType(){ 
  24.         return (String) contextHolder.get(); 
  25.     } 
  26.    /**
  27.     * 清空数据源类型
  28.     */
  29.     public static void clearDataSourceType(){ 
  30.         contextHolder.remove(); 
  31.     } 
  32. }
动态切换数据源类,该类需要继承AbstractRoutingDataSource类,并重写determineCurrentLookupKey()方法,从数据源类型容器中获取当前线程的数据源类型。相关代码如下:
  1. public class DynamicDataSource extends AbstractRoutingDataSource{ 
  2.     @Override 
  3.     protected Object determineCurrentLookupKey() { 
  4.         return DataSourceSwitch.getDataSourceType(); 
  5.     } 
  6. }
 

三、重写SpringBoot的数据源配置

         根据新配置的多数据源和新写的动态切换数据源类,配置新的SpringBoot数据源,具体代码如下:

 

  1. /**
  2.      * 动态数据源配置
  3.      *
  4.      * @return
  5.      */
  6.    @Primary
  7.     @Bean("dataSource")
  8.     public DynamicDataSource dataSource(@Qualifier("mysql") DataSource mysql,
  9.                                          @Qualifier("oracle") DataSource oracle) {
  10.        DynamicDataSource dynamicDataSource = new DynamicDataSource();
  11.         Map<Object, Object> targetDataSources = new HashMap<>();
  12.         targetDataSources.put(DataSourceDialect.MYSQL, mysql);
  13.         targetDataSources.put(DataSourceDialect.ORACLE, oracle);
  14.         dynamicDataSource.setTargetDataSources(targetDataSources);
  15.         // 设置默认的数据源
  16.         dynamicDataSource.setDefaultTargetDataSource(mysql);
  17.         return dynamicDataSource;
  18.     }

根据动态数据源配置,创建sqlSessionFactory,具体代码如下:

  1. @Primary
  2.     @Bean("sqlSessionFactory")
  3.     public SqlSessionFactory sqlSessionFactory(@Qualifier("mysql") DataSource mysql, @Qualifier("oracle") DataSource oracle) throws Exception {
  4.        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
  5.        sessionFactory.setDataSource(this.dataSource(mysql, oracle));
  6.        sessionFactory.setTypeAliasesPackage(env.getProperty("mybatis.typeAliasesPackage"));
  7.        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapper-locations")));
  8.        return sessionFactory.getObject();
  9.     }

根据动态数据源配置,创建transactionManager,具体代码如下:

  1. @Bean("transactionManager")
  2.    public DataSourceTransactionManager transactionManager(@Qualifier("dataSource") DynamicDataSource dataSource) throws Exception {
  3.       return new DataSourceTransactionManager(dataSource);
  4.    }

 

四、数据源配置类的整合代码

  1. /**
  2.  * 数据源配置
  3.  * @author hrc
  4.  * @date 2018年10月9日
  5.  */
  6. @Configuration
  7. public class DataSourceConfig {
  8.     @Autowired
  9.     private Environment env;
  10.     /**
  11.      * mysql数据源
  12.      * @return
  13.      */
  14.     @Bean("mysql") // bean的名称
  15.     @ConfigurationProperties(prefix = "spring.datasource.mysql") // application.properteis中对应属性的前缀
  16.     public DataSource mysqlDataSource() {
  17.         return DataSourceBuilder.create().build();
  18.     }
  19.     /**
  20.      * oracle数据源
  21.      * @return
  22.      */
  23.     @Bean("oracle") // bean的名称
  24.     @ConfigurationProperties(prefix = "spring.datasource.oracle") // application.properteis中对应属性的前缀
  25.     public DataSource oracleDataSource() {
  26.         return DataSourceBuilder.create().build();
  27.     }
  28.     /**
  29.      * 动态数据源配置
  30.      * @return
  31.      */
  32.     @Primary
  33.     @Bean("dataSource")
  34.     public DynamicDataSource dataSource(@Qualifier("mysql") DataSource mysql,
  35.                                          @Qualifier("oracle") DataSource oracle) {
  36.         DynamicDataSource dynamicDataSource = new DynamicDataSource();
  37.         Map<Object, Object> targetDataSources = new HashMap<>();
  38.         targetDataSources.put(DataSourceDialect.MYSQL, mysql);
  39.         targetDataSources.put(DataSourceDialect.ORACLE, oracle);
  40.         dynamicDataSource.setTargetDataSources(targetDataSources);
  41.         // 设置默认的数据源
  42.         dynamicDataSource.setDefaultTargetDataSource(mysql);
  43.         return dynamicDataSource;
  44.     }
  45.     @Primary
  46.     @Bean("sqlSessionFactory")
  47.     public SqlSessionFactory sqlSessionFactory(@Qualifier("mysql") DataSource mysql, @Qualifier("oracle") DataSource oracle) throws Exception {
  48.         SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
  49.         sessionFactory.setDataSource(this.dataSource(mysql, oracle));
  50. sessionFactory.setTypeAliasesPackage(env.getProperty("mybatis.typeAliasesPackage"));
  51.         sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapper-locations")));
  52.         return sessionFactory.getObject();
  53.     }
  54.     @Bean("transactionManager")
  55.     public DataSourceTransactionManager transactionManager(@Qualifier("dataSource") DynamicDataSource dataSource) throws Exception {
  56.        return new DataSourceTransactionManager(dataSource);
  57.     }
  58. }

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多