Spring Boot Mybatisマルチデータソース構成

9097 ワード

Spring bootプロジェクトで複数のデータソースを構成する場合は開発中によく見かけますが、Spring Boot+MyBatisでmysql+Postgresqlデュアルデータソースプロジェクトの構築を実現します.詳細コードは以下を参照してください.
https://gitee.com/senn-wen/my...
一、依存構成
pom.xmlファイルには、postgresqlおよび mysqlのドライバファイルが導入されています.

  org.postgresql
  postgresql
  runtime




  mysql
  mysql-connector-java
  runtime

二、Spring boot配置
2.1 application.yml構成
接続が必要なデータベース接続パラメータを構成します.次の例ではpostgresqlとmysqlを構成します.hikariCPを接続プールとして選択したので、下にhikariを構成します.オンラインのサービスであれば、実際のサーバのパフォーマンスサイズに応じてパラメータを設定することをお勧めします.パラメータを接続する構成パスを覚えておいて、後で使用します.
spring:
  datasource:

    postgresql:
      driver-class-name: org.postgresql.Driver
      url: jdbc:postgresql://url:port/database
      username: postGIS
      password: postGIS

    mysql:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://url:port/database
      username: root
      password: root
      
    hikari:
      maximum-pool-size: 3
      connection-timeout: 500

2.2 Spring datasource自動化構成依存性の排除
Spring Bootは構成を自動的に組み立てるので、カスタム構成を有効にするには@SpringBootApplicationでdatasoureに関連する構成を排除する必要があります.主に3つあります.
  • データソース:DataSourceAutoConfiguration.class
  • 取引:D a t o u r c e T r o n s a c t ionManagerAutoConfiguration.class
  • Jdbcテンプレート:JdbcTemplateAutoConfiguration.class
  • @SpringBootApplication(exclude = {
            DataSourceAutoConfiguration.class,
            DataSourceTransactionManagerAutoConfiguration.class,
            JdbcTemplateAutoConfiguration.class
    })
    public class PostgresqlApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(PostgresqlApplication.class, args);
        }
    
    }

    三、データソースの配置
    上記の基本構成が完了すると、特定のBeanを構成する必要があります.各データ・ソースの推奨は、後でメンテナンスするのに便利です.データ・ソース構成には、次の2つの主要な手順があります.
  • ソースデータの構成(プロファイルを読み込み、新しいDataSourceを生成)
  • ORMフレームワークがどこでこのデータソース
  • を使用するかを指定する.
    この2つはフレームワークでは与えられず、手動で構成するしかありません.
    3.1 MySQLデータソース構成
    package com.senn.postgresql.config;
    
    import com.zaxxer.hikari.HikariDataSource;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.DependsOn;
    import org.springframework.context.annotation.Primary;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    
    import javax.sql.DataSource;
    
    /**
     * @author senn
     * @version 1.0.0
     * @ClassName MsqlDataSourceConfig.java
     * @Description mysql      
     * @createTime 2021 01 15  09:02:00
     */
    @Configuration
    @Slf4j
    @MapperScan(basePackages = "com.senn.postgresql.common.mapper.mysql",
            sqlSessionFactoryRef = "mysqlDataSourceFactory")
    public class MsqlDataSourceConfig {
    
    
        /**
         * @description mysql DataSource Properties   
         * @updateTime  2021/1/15 9:04
         */
    
        @Bean(name = "mysqlDataSourceProperties")
        @ConfigurationProperties("spring.datasource.mysql")
        public DataSourceProperties mysqlDataSourceProperties() {
            return new DataSourceProperties();
        }
    
        /**
         * @description   mysql DataSource    
         * @updateTime  2021/1/15 9:11
         */
        @Bean(name = "mysqlDataSource")
        @ConfigurationProperties("spring.datasource.mysql.configuration")
        public javax.sql.DataSource mysqlDataSource() {
            DataSourceProperties dataSourceProperties = mysqlDataSourceProperties();
            log.info(dataSourceProperties.getUrl());
            //           Hikari
            return mysqlDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
        }
    
    
        //       mybatis   
        /**
         * @description mysql     
         * @updateTime  2021/1/15 9:18
         */
        @Bean("mysqlDataSourceFactory")
        @DependsOn("mysqlDataSource")
        public SqlSessionFactory dataSourceFactory() throws Exception {
            SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
            factoryBean.setDataSource(mysqlDataSource());
            return factoryBean.getObject();
        }
    
        /**
         * @description mysql session     
         * @updateTime  2021/1/15 9:22
         */
    
        @Bean("mysqlSqlSessionTemplate")
        @DependsOn("mysqlDataSourceFactory")
        public SqlSessionTemplate sqlSessionTemplate(@Qualifier("mysqlDataSourceFactory") SqlSessionFactory sessionFactory) {
            return new SqlSessionTemplate(sessionFactory);
        }
    
        /**
         * @description mysql      
         * @updateTime  2021/1/15 9:22
         */
        @Bean(name = "mysqlTransactionManager")
        @DependsOn("mysqlDataSource")
        public DataSourceTransactionManager mysqlTransactionManager(@Qualifier("mysqlDataSource") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    
    }

    Postgresqlデータソース構成
    package com.senn.postgresql.config;
    
    import com.zaxxer.hikari.HikariDataSource;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.DependsOn;
    import org.springframework.context.annotation.Primary;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    
    import javax.sql.DataSource;
    
    /**
     * @author senn
     * @version 1.0.0
     * @ClassName DataSourceConfig.java
     * @Description psotgresql      
     * @createTime 2021 01 14  15:56:00
     */
    @Configuration
    @Slf4j
    @MapperScan(basePackages = "com.senn.postgresql.common.mapper.postgresql",
            sqlSessionFactoryRef = "postgresqlDataSourceFactory")
    public class PostgresqlDataSourceConfig {
    
    
        /**
         * @description postgresql DataSource Properties   
         * @updateTime  2021/1/15 9:04
        */
    
        @Bean(name = "postgresqlDataSourceProperties")
        @ConfigurationProperties("spring.datasource.postgresql")
        public DataSourceProperties postgresqlDataSourceProperties() {
            return new DataSourceProperties();
        }
    
        /**
         * @description   postgresql DataSource    
         * @param
         * @updateTime  2021/1/15 9:11
         * @throws
        */
        @Bean(name = "postgresqlDataSource")
        @ConfigurationProperties("spring.datasource.postgresql.configuration")
        public DataSource postgresqlDataSource() {
            DataSourceProperties dataSourceProperties = postgresqlDataSourceProperties();
            log.info(dataSourceProperties.getUrl());
            //           Hikari
            return postgresqlDataSourceProperties().initializeDataSourceBuilder().type(HikariDataSource.class).build();
        }
    
        //       mybatis   
    
        /**
         * @description postgresql     
         * @updateTime  2021/1/15 9:18
        */
        @Bean("postgresqlDataSourceFactory")
        @DependsOn("postgresqlDataSource")
        public SqlSessionFactory dataSourceFactory() throws Exception {
            SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
            factoryBean.setDataSource(postgresqlDataSource());
            return factoryBean.getObject();
        }
    
        /**
         * @description postgresql session     
         * @updateTime  2021/1/15 9:22
        */
    
        @Bean("postgresqlSqlSessionTemplate")
        @Primary
        @DependsOn("postgresqlDataSourceFactory")
        public SqlSessionTemplate sqlSessionTemplate(@Qualifier("postgresqlDataSourceFactory") SqlSessionFactory sessionFactory) {
            return new SqlSessionTemplate(sessionFactory);
        }
    
        /**
         * @description postgresql      
         * @updateTime  2021/1/15 9:22
         */
        @Bean(name = "postgresqlTransactionManager")
        @DependsOn("postgresqlDataSource")
        public DataSourceTransactionManager fawkesTransactionManager(@Qualifier("postgresqlDataSource") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    
    }

    @Senn・森