SpringBoot、SpringData JPA 雙數據源,記錄一下

關閉數據源和事務的自動配置,啓動類上

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

1、pom.xml配置

spring:
  profiles:
    active: dev
  application:
    name: wangyk-demo
  jpa:
    hibernate:
      ddl-auto: update
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    properties:
      hibernate:
        dialect: com.wangyk.demo.config.MySQL5InnoDBDialectUtf8mb4
    open-in-view: false
customer:
  #primary datasource
  primary:
    datasource:
      jdbcUrl: jdbc:mysql://localhost:3306/user?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false
      username: root
      password: 12345678
      driver-class-name: com.mysql.jdbc.Driver
      initialSize: 5
      minIdle: 5
      maxActive: 100
      validationQuery: SELECT 1
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      maxWait: 60000
      timeBetweenEvictionRunsMillis: 30000
  #secondary datasource
  secondary:
    datasource:
      jdbcUrl: jdbc:mysql://localhost:3306/order?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false
      username: root
      password: 12345678
      driver-class-name: com.mysql.jdbc.Driver
      initialSize: 5
      minIdle: 5
      maxActive: 100
      validationQuery: SELECT 1
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      maxWait: 60000
      timeBetweenEvictionRunsMillis: 30000

2、DataSource配置

@Configuration
public class DataSourceConfig {

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

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

3、repository的配置

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.wangyk.demo.dao.primary"},//這裏要指向你的repository路徑
        entityManagerFactoryRef = "primaryEntityManagerFactory",
        transactionManagerRef = "primaryTransactionManager")
public class PrimaryJpaConfiguration {

    @Autowired(required = false)
    private PersistenceUnitManager persistenceUnitManager;

    @Resource
    private JpaProperties jpaProperties;

    @Resource
    private HibernateProperties hibernateProperties;

    @Bean
    @Primary
    public EntityManagerFactoryBuilder primaryEntityManagerFactoryBuilder() {
        AbstractJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
        return new EntityManagerFactoryBuilder(adapter,
                jpaProperties.getProperties(), this.persistenceUnitManager);
    }

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(
            @Qualifier("primaryEntityManagerFactoryBuilder") EntityManagerFactoryBuilder builder,
            @Qualifier("primaryDataSource") DataSource primaryDataSource) {
        return builder
                .dataSource(primaryDataSource)
                .packages("com.wangyk.demo.domain.primary")
                .persistenceUnit("primary")
                .properties(hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()))
                .build();
    }

    @Bean
    @Primary
    public JpaTransactionManager primaryTransactionManager(@Qualifier("primaryEntityManagerFactory") EntityManagerFactory primaryEntityManagerFactory) {
        return new JpaTransactionManager(primaryEntityManagerFactory);
    }
}


/**
 * @author :wangyongkang
 * @date :Created in 2019/11/27 3:07 下午
 * @description: secondary數據源的配置
 * @modified By:
 * @version:
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.wangyk.demo.dao.secondary"},//這裏要指向你的repository路徑
        entityManagerFactoryRef = "secondaryEntityManagerFactory",
        transactionManagerRef = "secondaryTransactionManager")
public class SecondaryJpaConfiguration {

    @Autowired(required = false)
    private PersistenceUnitManager persistenceUnitManager;

    @Resource
    private JpaProperties jpaProperties;

    @Resource
    private HibernateProperties hibernateProperties;

    @Bean
    public EntityManagerFactoryBuilder secondaryEntityManagerFactoryBuilder() {
        AbstractJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
        return new EntityManagerFactoryBuilder(adapter,
                jpaProperties.getProperties(), this.persistenceUnitManager);
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(
            @Qualifier("secondaryEntityManagerFactoryBuilder") EntityManagerFactoryBuilder builder,
            @Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
        return builder
                .dataSource(secondaryDataSource)
                .packages("com.wangyk.demo.domain.secondary")
                .persistenceUnit("secondary")
                .properties(hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()))
                .build();
    }

    @Bean
    public JpaTransactionManager secondaryTransactionManager(@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory secondaryEntityManagerFactory) {
        return new JpaTransactionManager(secondaryEntityManagerFactory);
    }
}

4、MySql引擎

public class MySQL5InnoDBDialectUtf8mb4 extends MySQL5Dialect {
    @Override
    public String getTableTypeString() {
        return "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci";
    }
}

 

發佈了40 篇原創文章 · 獲贊 40 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章