Springboot は JPA 複数のデータソース (Oracle+Mysql) を統合します

1.メイヴン

<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 数据库连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.9</version>
</dependency>
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc8</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
</dependency>

2. 基本構成

2.1 データソース

基本構成では、まず複数のデータ ソースと DataSource の基本情報を構成し、最初に次の構成情報を application.yml に追加します。

spring:
  datasource:
    # oracle数据库配置
    oracle:
      driver-class-name: oracle.jdbc.driver.OracleDriver
      url: jdbc:oracle:thin:@localhost:1521:orcl
      username: test
      password: test
    # mysql数据库配置
    mysql:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/swap_business_db?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
      username: root
      password: root
    type: com.alibaba.druid.pool.DruidDataSource
    # druid数据库连接池
    druid:
      filters: stat
      initialSize: 5
      maxActive: 20
      maxPoolPreparedStatementPerConnectionSize: 20
      maxWait: 60000
      minEvictableIdleTimeMillis: 30000
      minIdle: 5
      poolPreparedStatements: false
      testOnBorrow: false
      testOnReturn: false
      testWhileIdle: true
      timeBetweenEvictionRunsMillis: 60000
      #Oracle模式
      validation-query: SELECT 1 FROM DUAL #用来检测连接是否有效的sql
      #MySQL模式
      validation-queryM: SELECT 1 #用来检测连接是否有效的sql
  jpa:
    hibernate:
      ddl-auto: none
      oracle-dialect: org.hibernate.dialect.Oracle10gDialect
      mysql-dialect: org.hibernate.dialect.MySQL8Dialect
    show-sql: false

次に、次のように 2 つの DataSource を構成します。

@Configuration
public class DataSourceConfig {
    
    

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.oracle")
    @Primary
    DataSource dsOracle() {
    
    
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.mysql")
    DataSource dsMysql() {
    
    
        return DruidDataSourceBuilder.create().build();
    }
}

注:@Primaryこの注釈は、欠落していてはなりません。そうしないと、プロジェクトの開始時にエラーが発生します。@Primary は、特定のクラスのインスタンスが複数ある場合に、どのインスタンスが最初に使用されるかを示します。

3. 複数のデータ ソース構成

次に、Jpaの基本情報を設定します.ここでは、2つのデータソースをそれぞれ2つのクラスで設定します.oracleとmysqlの設定は次のとおりです.

3.1 JpaConfigOracle

@Configuration
@EnableJpaRepositories(basePackages = "cn.piesat.dao.oracle",
        entityManagerFactoryRef = "localContainerEntityManagerFactoryBeanOracle",
        transactionManagerRef = "platformTransactionManagerOracle")
public class JpaConfigOracle {
    
    
    @Autowired
    @Qualifier(value = "dsOracle")
    DataSource dsOracle;

    @Autowired
    JpaProperties jpaProperties;
    @Autowired
    private HibernateProperties hibernateProperties;

    @Value("${spring.jpa.hibernate.oracle-dialect}")
    private String oracleDialect;
    @Value("${spring.jpa.show-sql}")
    private String showSql;


    @Bean
    @Primary
    LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBeanOracle(EntityManagerFactoryBuilder builder) {
    
    
        return builder.dataSource(dsOracle)
                .packages("cn.piesat.model")
                .properties(getVendorProperties())
                .persistenceUnit("pu1")
                .build();
    }

    /**
     * 设置数据源属性
     *
     * @return
     */
    private Map<String, Object> getVendorProperties() {
    
    
        Map<String, String> map = new HashMap<>();
        // 设置oracle数据库方言
        map.put("hibernate.dialect", oracleDialect);
        map.put("show-sql", showSql);
        jpaProperties.setProperties(map);
        return hibernateProperties.determineHibernateProperties(
                jpaProperties.getProperties(), new HibernateSettings());
    }

    /**
     * 配置事务管理器
     *
     * @param builder
     * @return
     */
    @Bean
    PlatformTransactionManager platformTransactionManagerOracle(EntityManagerFactoryBuilder builder) {
    
    
        LocalContainerEntityManagerFactoryBean factoryBeanOracle = localContainerEntityManagerFactoryBeanOracle(builder);
        return new JpaTransactionManager(factoryBeanOracle.getObject());
    }
}

設定説明:JpaPropertiesシステム提供の例で、内部のデータはapplication.ymlで設定したjpa関連の設定です。HibernatePropertiesさまざまなデータベースの方言を定義するなど、データ ソース プロパティを手動で設定するために使用されます。次に、MyBatis と JdbcTemplateとは異なる2 つの Bean、つまりLocalContainerEntityManagerFactoryBeanトランザクションマネージャーを提供しますLocalContainerEntityManagerFactoryBean を提供する場合は、パッケージを指定する必要があります.ここで指定するパッケージは、このデータ ソースに対応するエンティティ クラスの場所です.また、dao の場所は、ここで構成クラスのアノテーションによって指定され、LocalContainerEntityManagerFactoryBean に対応する参照および PlatformTransactionManagerそれぞれの名前。PlatformTransactionManager@EnableJpaRepositories

このようにして、最初のものは構成され、2 番目のものは基本的にこれと似ていますが、いくつかの主な違いがあります。

  • ダオの場所が違う
  • persistenceUnit が異なります
  • 関連する Bean の名前が異なります

3.2 JpaConfigMysql

@Configuration
@EnableJpaRepositories(basePackages = "cn.piesat.dao.mysql",
        entityManagerFactoryRef = "localContainerEntityManagerFactoryBeanMysql",
        transactionManagerRef = "platformTransactionManagerMysql")
public class JpaConfigMysql {
    
    
    @Autowired
    @Qualifier(value = "dsMysql")
    DataSource dsMysql;

    @Autowired
    JpaProperties jpaProperties;

    @Autowired
    private HibernateProperties hibernateProperties;

    @Value("${spring.jpa.hibernate.mysql-dialect}")
    private String mysqlDialect;
    @Value("${spring.jpa.show-sql}")
    private String showSql;


    @Bean
    LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBeanMysql(EntityManagerFactoryBuilder builder) {
    
    
        return builder.dataSource(dsMysql)
                .packages("cn.piesat.model")
                .properties(getVendorProperties())
                .persistenceUnit("pu2")
                .build();
    }

    /**
     * 设置数据源属性
     *
     * @return
     */
    private Map<String, Object> getVendorProperties() {
    
    
        Map<String, String> map = new HashMap<>();
        // 设置mysql数据库方言
        map.put("hibernate.dialect", mysqlDialect);
        map.put("show-sql", showSql);
        jpaProperties.setProperties(map);
        return hibernateProperties.determineHibernateProperties(
                jpaProperties.getProperties(), new HibernateSettings());
    }

    /**
     * 配置事务管理器
     *
     * @param builder
     * @return
     */
    @Bean
    PlatformTransactionManager platformTransactionManagerMysql(EntityManagerFactoryBuilder builder) {
    
    
        LocalContainerEntityManagerFactoryBean factoryBeanMysql = localContainerEntityManagerFactoryBeanMysql(builder);
        return new JpaTransactionManager(factoryBeanMysql.getObject());
    }
}

4. Dao レイヤー インターフェイス

次に、関連するエンティティ クラスと dao を対応する位置に指定します。注:エンティティ クラスは共有できますが、dao の位置は異なります。

オラクルのインターフェース:

package cn.piesat.dao.oracle;

public interface TMasOrbitInfoDao extends JpaRepository<TMasOrbitInfo, String> {
    
    
    List<TMasOrbitInfo> findBySatelliteAndObservationDateBetween(String satellite, String start, String end);
}

mysql インターフェース:

package cn.piesat.dao.mysql;

public interface SwapBusinessEfficiencyMainDao extends JpaRepository<SwapBusinessEfficiencyMain, String> {
    
    
    List<SwapBusinessEfficiencyMain> findByDataIdentifyAndDataTimeBetween(String identify, String start, String end);
}

この時点で、すべての構成が完了し、さまざまな Daos をサービスに注入できます。さまざまな Daos がさまざまなデータ ソースを操作します。

おすすめ

転載: blog.csdn.net/weixin_45698637/article/details/127869598