Spring bootマルチデータソース構成(Mybatics+JPA)


Spring boot構成データソース
spring:
  mvc:
    favicon:
      enabled: false
  datasource:
    primary:
      username: root
      password: root
      jdbc-url: mysql://127.0.0.1:3306/a?useUnicode=true
      driver-class-name: com.mysql.jdbc.Driver
      dbcp2:
        initial-size: 5
        min-idle: 5
        max-idle: 100
        max-wait-millis: 10000
        validation-query: SELECT 1

    secondary:
      username: root
      password: root
      jdbc-url: mysql://127.0.0.1:3306/b?useUnicode=true
      driver-class-name: com.mysql.jdbc.Driver
      dbcp2:
        initial-size: 5
        min-idle: 5
        max-idle: 100
        max-wait-millis: 10000
        validation-query: SELECT 1

ただし、***primary***secondary***はデータソース構成であり、複数構成可能です.
データ・ソース構成アイテム
@Configuration
public class DataSourceConfig {

	@Primary
	@Bean(name="primaryDataSource")
	@Qualifier("primaryDataSource")
	@ConfigurationProperties(prefix="spring.datasource.primary")//    application.yml         
	public DataSource primaryDataSource() {
		return DataSourceBuilder.create().build();
	}

	@Bean(name="secondaryDataSource")
	@Qualifier("secondaryDataSource")
	@ConfigurationProperties(prefix="spring.datasource.secondary")//    application.yml         
	public DataSource secondaryDataSource() {
		return DataSourceBuilder.create().build();
	}
}

@Primary

@Primary
  :           ,         

データ・ソース構成項目の内容-primary
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
		entityManagerFactoryRef="entityManagerFactoryPrimary", 
		transactionManagerRef="transactionManagerPrimary")
@EntityScan(basePackages= "com.lance.server.*.model")

@MapperScan(basePackages = "com.lance.server.*.dao", sqlSessionTemplateRef = "primarySqlSessionTemplate")
public class PrimaryConfig {
	
	@Autowired 
	@Qualifier("primaryDataSource") //    DataSourceConfig  primaryDataSource
	private DataSource primaryDataSource;


	/** JPA ***/

    @Primary
    @Bean(name="entityManagerFactoryPrimary")
	public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder build) {
		return build.dataSource(primaryDataSource).
				packages("com.lance.server.*.model").
				persistenceUnit("primaryPersistenceUnit").
				build();
	}

    @Primary
    @Bean(name = "entityManagerPrimary")
	public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
		return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
	}
    
    @Primary
    @Bean(name = "transactionManagerPrimary")
    public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
    }


    /**mybatits       ***/

    /***
     * Mybatics    
     * @author Lance [email protected]
     * @date 2019-09-21 11:58
     * @param
     * @return org.apache.ibatis.session.SqlSessionFactory
     *
     * */
	@Primary
	@Bean(name = "primarySqlSessionFactory")
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
		SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
		sqlSessionFactoryBean.setDataSource(dataSource);
		sqlSessionFactoryBean.setMapperLocations(
				new PathMatchingResourcePatternResolver().getResources("classpath:mapper/primary/**/*.xml"));
		return sqlSessionFactoryBean.getObject();
	}

	/***
	 * Mybatics     
	 * @author Lance [email protected]
	 * @date 2019-09-21 11:58
	 * @param
	 * @return org.springframework.jdbc.datasource.DataSourceTransactionManager
	 *
	 * */
	@Primary
	@Bean(name = "primaryDataSourceTransactionManager")
	public DataSourceTransactionManager primaryDataSourceTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}

	/***
	 * mybatics   
	 * @author Lance [email protected]
	 * @date 2019-09-21 11:57
	 * @param sqlSessionFactory
	 * @return org.mybatis.spring.SqlSessionTemplate
	 * 
	 * */
	@Primary
	@Bean(name = "primarySqlSessionTemplate")
	public SqlSessionTemplate primarySqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

@EnableJpaRepositories
  :JPA       ,             

@MapperScan
  :Mybatics         ,           SQL  Session  ,     ,      `@Primary`   SQL Session   

データ・ソース構成アイテムの内容-Secondary
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactorySecondary",
        transactionManagerRef = "transactionManagerSecondary")
@EntityScan(basePackages = "com.lance.server.secondary.**.model")

@MapperScan(basePackages = "com.lance.server.secondary.**.dao", sqlSessionTemplateRef = "secondarySqlSessionTemplate")
public class SecondaryConfig {

    @Autowired
    @Qualifier("secondaryDataSource")
    private DataSource secondaryDataSource;


    /** JPA ***/

    @Bean(name = "entityManagerFactorySecondary")
    public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(EntityManagerFactoryBuilder build) {
        return build.dataSource(secondaryDataSource).
                packages("com.lance.server.secondary.**.model").
                persistenceUnit("secondaryPersistenceUnit").
                build();
    }

    @Bean(name = "entityManagerSecondary")
    public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
        return entityManagerFactorySecondary(builder).getObject().createEntityManager();
    }

    @Bean(name = "transactionManagerSecondary")
    public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
    }

    /***
     * Mybatics    
     * @author Lance [email protected]
     * @date 2019-09-21 11:58
     * @param
     * @return org.apache.ibatis.session.SqlSessionFactory
     *
     * */
    @Bean(name = "secondarySqlSessionFactory")
    public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath:mapper/secondary/**/*.xml"));
        return sqlSessionFactoryBean.getObject();
    }

    /***
     * Mybatics     
     * @author Lance [email protected]
     * @date 2019-09-21 11:58
     * @param
     * @return org.springframework.jdbc.datasource.DataSourceTransactionManager
     *
     * */
    @Bean(name = "secondaryDataSourceTransactionManager")
    public DataSourceTransactionManager secondaryDataSourceTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /***
     * mybatics   
     * @author Lance [email protected]
     * @date 2019-09-21 11:57
     * @param sqlSessionFactory
     * @return org.mybatis.spring.SqlSessionTemplate
     *
     * */
    @Bean(name = "secondarySqlSessionTemplate")
    public SqlSessionTemplate secondarySqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}