欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot多數(shù)據(jù)庫連接(mysql+oracle)的實現(xiàn)

 更新時間:2021年03月19日 09:33:32   作者:吳家二少  
這篇文章主要介紹了SpringBoot多數(shù)據(jù)庫連接(mysql+oracle)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

出于業(yè)務(wù)需求,有時我們需要在spring boot web應(yīng)用程序中配置多個數(shù)據(jù)源并連接到多個數(shù)據(jù)庫。
使用過Spring Boot框架的小伙伴們,想必都發(fā)現(xiàn)了Spring Boot對JPA提供了非常好的支持,在開發(fā)過程中可以很簡潔的代碼輕松訪問數(shù)據(jù)庫,獲取我們想要的數(shù)據(jù)。
因此在這里,使用Spring Boot和JPA配置多個數(shù)據(jù)源的場景。

項目配置

在本文中,主要使用兩個不同的數(shù)據(jù)庫,分別為:

  • mysql(springboot)【primary,優(yōu)先搜尋該數(shù)據(jù)庫】:mysql數(shù)據(jù)庫,包含User的信息
  • oracle(springboot): oracle數(shù)據(jù)庫, 包含Country信息

項目依賴

為了支持Mysql和Oracle數(shù)據(jù)庫,我們必須要在pom.xml文件中添加相應(yīng)的依賴。

<dependencies>
  <dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.2.0.3.0</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
  <dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>javax.persistence-api</artifactId>
    <version>2.2</version>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
  </dependency>
</dependencies>

包管理

為了方便代碼的開發(fā),我們將mysql和oracle分開放在兩個不同的package下面,具體的包結(jié)構(gòu)如下:

將不同的模型分開放入mysql和oracle包目錄下,需要注意的是,mysql和oracle為兩個不同的數(shù)據(jù)庫,所以兩個數(shù)據(jù)庫中可能存在某個表名稱一致的場景。該場景下,會優(yōu)先匹配primary的數(shù)據(jù)庫,如果該數(shù)據(jù)庫down了,才會匹配另外一張表。所以,如果想要兩張表都正常使用,建議使用不同的Entity名稱。

數(shù)據(jù)庫連接配置

我們在屬性文件application.properties中分別配置兩個單獨的jdbc連接,將所有關(guān)聯(lián)的Entity類和Repository映射到兩個不同的包中。

## jdbc-primary
spring.datasource.url=jdbc:mysql://localhost:33306/springboot?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false
spring.datasource.username=springboot
spring.datasource.password=123456
spring.ds_mysql.driverClassName=com.mysql.jdbc.Driver

## jdbc-second
spring.second.datasource.url=jdbc:oracle:thin:@localhost:1909/xxx.xxx.com
spring.second.datasource.userName=springboot
spring.second.datasource.password=123456
spring.second.datasource.driver-class-name=oracle.jdbc.OracleDriver

## jpa
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
spring.jpa.properties.hibernate.jdbc.fetch_size=500
spring.jpa.properties.hibernate.jdbc.batch_size=100

數(shù)據(jù)源配置

需要注意的是,在配置多個數(shù)據(jù)源期間,必須將其中一個數(shù)據(jù)源標(biāo)記為primary,否則Spring Boot會檢測到多個類型的數(shù)據(jù)源,從而無法正常啟動。

定義Data Source的Bean

想要創(chuàng)建Data Source,我們必須先實例化org.springframework.boot.autoconfigure.jdbc.DataSourceProperties類,加載application.properties文件中配置的數(shù)據(jù)庫連接信息,并通過DataSourceProperties對象的初始化builder方法創(chuàng)建一個javax.sql.DataSource對象。

primary Data Source

@Primary
@Bean(name = "mysqlDataSourceProperties")
@ConfigurationProperties("spring.datasource")
public DataSourceProperties dataSourceProperties() {
  return new DataSourceProperties();
}

@Primary
@Bean(name = "mysqlDataSource")
@ConfigurationProperties("spring.datasource.configuration")
public DataSource dataSource (@Qualifier("mysqlDataSourceProperties") DataSourceProperties mysqlDataSourceProperties) {
  return mysqlDataSourceProperties.initializeDataSourceBuilder()
      .type(HikariDataSource.class)
      .build();
}

Secondary Data Source

@Bean(name = "oracleDataSourceProperties")
@ConfigurationProperties("spring.second.datasource")
public DataSourceProperties dataSourceProperties() {
  return new DataSourceProperties();
}

@Bean
@ConfigurationProperties("spring.second.datasource.configuration")
public DataSource oracleDataSource(@Qualifier("oracleDataSourceProperties") DataSourceProperties oracleDataSourceProperties) {
  return oracleDataSourceProperties.initializeDataSourceBuilder()
      .type(HikariDataSource.class)
      .build();
}

我們使用@Qualifier注解,自動關(guān)聯(lián)指定的DataSourceProperties.

定義實體類管理工廠的Bean

上面說了,應(yīng)用程序使用Spring Data JPA的repository接口將我們從實體管理器(Entity Manager)中抽象出來,從而進(jìn)行數(shù)據(jù)的訪問。這里,我們使用org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean這個Bean來創(chuàng)建EM實例,后面利用這個EM實例與JPA entities進(jìn)行交互。

由于我們這里有兩個數(shù)據(jù)源,所以我要為每個數(shù)據(jù)源單獨創(chuàng)建一個EntityManagerFactory。

Primary Entity Manager Factory

@Primary
@Bean(name = "mysqlEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
    EntityManagerFactoryBuilder builder, @Qualifier("mysqlDataSource") DataSource mysqlDataSource) {
  return builder.dataSource(mysqlDataSource)
      .packages("com.example.demo.model.mysql")
      .persistenceUnit("mysql")
      .build();
}

Secondary Entity Manager Factory

@Bean(name = "oracleEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean oracleEntityManagerFactory(
    EntityManagerFactoryBuilder builder, @Qualifier("oracleDataSource") DataSource oracleDataSource) {
  return builder.dataSource(oracleDataSource)
      .packages("com.example.demo.model.oracle")
      .persistenceUnit("oracle")
      .build();
}

我們使用@Qualifie注解,自動將DataSource關(guān)聯(lián)到對應(yīng)的EntityManangerFactory中。
在這里我們可以分別配置實體類管理工廠所管理的packages,為了方便開發(fā)和閱讀,分別將mysql和oracle關(guān)聯(lián)的實體類放在對應(yīng)的目錄下。

事務(wù)管理

我們?yōu)槊總€數(shù)據(jù)庫創(chuàng)建一個JPA事務(wù)管理器。
查看源碼我們可以發(fā)現(xiàn)JPA事務(wù)管理器需要EntityManangerFactory作為入?yún)?,所以利用上述定義的EntityMangerFactory分別生成對應(yīng)的JPA事物管理器。

源碼:

public JpaTransactionManager(EntityManagerFactory emf) {
  this();
  this.entityManagerFactory = emf;
  this.afterPropertiesSet();
}

Primary transaction manager

@Primary
@Bean(name = "mysqlTransactionManager")
public PlatformTransactionManager mysqlTransactionManager(final @Qualifier("mysqlEntityManagerFactory")
                                 LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory) {
  return new JpaTransactionManager(mysqlEntityManagerFactory.getObject());
}

Secondary transaction manager

@Bean(name = "oracleTransactionManager")
public PlatformTransactionManager oracleTransactionManager(
    final @Qualifier("oracleEntityManagerFactory")
        LocalContainerEntityManagerFactoryBean oracleEntityManagerFactory) {
  return new JpaTransactionManager(oracleEntityManagerFactory.getObject());
}

JPA Repository配置

由于我們使用了兩個不同的數(shù)據(jù)源,所以我們必須使用@EnableJpaRepositories注解為每個數(shù)據(jù)源提供特定的信息。
進(jìn)入該注解源碼,我們可以發(fā)現(xiàn)默認(rèn)值如下:

/**
 * Annotation to enable JPA repositories. Will scan the package of the annotated configuration class for Spring Data
 * repositories by default.
 *
 * @author Oliver Gierke
 * @author Thomas Darimont
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(JpaRepositoriesRegistrar.class)
public @interface EnableJpaRepositories {
  /**
   * Base packages to scan for annotated components. {@link #value()} is an alias for (and mutually exclusive with) this
   * attribute. Use {@link #basePackageClasses()} for a type-safe alternative to String-based package names.
   */
  String[] basePackages() default {};
  
  /**
   * Configures the name of the {@link EntityManagerFactory} bean definition to be used to create repositories
   * discovered through this annotation. Defaults to {@code entityManagerFactory}.
   *
   * @return
   */
  String entityManagerFactoryRef() default "entityManagerFactory";
  
  /**
   * Configures the name of the {@link PlatformTransactionManager} bean definition to be used to create repositories
   * discovered through this annotation. Defaults to {@code transactionManager}.
   *
   * @return
   */
  String transactionManagerRef() default "transactionManager";
}

這里僅列了一些我們關(guān)心的方法。

從源碼我中我們可以看見,

  • basePackages: 使用此字段設(shè)置Repository的基本包,必須指向軟件包中repository所在目錄。
  • entityManagerFactoryRef:使用此字段引用默認(rèn)或自定義的Entity Manager Factory, 這里通過Bean的名稱進(jìn)行指定, 默認(rèn)Bean為entityManagerFactory。
  • transactionManagerRef:使用此字段引用默認(rèn)或自定義的事務(wù)管理器,這里通過Bean的名稱進(jìn)行指定,默認(rèn)Bean為transactionManager。

通過上面的內(nèi)容,我們?yōu)閮蓚€不同的數(shù)據(jù)源分別定義了不同的名稱,所以我們需要在這里分別將其注入容器中。

Primary

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.example.demo.repository.mysql"},
    entityManagerFactoryRef = "mysqlEntityManagerFactory", transactionManagerRef = "mysqlTransactionManager")
public class MysqlDataSourceConfiguration {
  ...
}

secondary

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.example.demo.repository.oracle",
    entityManagerFactoryRef = "oracleEntityManagerFactory", transactionManagerRef = "oracleTransactionManager")
public class OracleDataSourceConfiguration {
  ...
}

完整的配置文件

primary

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.example.demo.repository.mysql"},
    entityManagerFactoryRef = "mysqlEntityManagerFactory", transactionManagerRef = "mysqlTransactionManager")
public class MysqlDataSourceConfiguration {

  @Primary
  @Bean(name = "mysqlDataSourceProperties")
  @ConfigurationProperties("spring.datasource")
  public DataSourceProperties dataSourceProperties() {
    return new DataSourceProperties();
  }

  @Primary
  @Bean(name = "mysqlDataSource")
  @ConfigurationProperties("spring.datasource.configuration")
  public DataSource dataSource (@Qualifier("mysqlDataSourceProperties") DataSourceProperties mysqlDataSourceProperties) {
    return mysqlDataSourceProperties.initializeDataSourceBuilder()
        .type(HikariDataSource.class)
        .build();
  }

  @Primary
  @Bean(name = "mysqlEntityManagerFactory")
  public LocalContainerEntityManagerFactoryBean entityManagerFactory(
      EntityManagerFactoryBuilder builder, @Qualifier("mysqlDataSource") DataSource mysqlDataSource) {
    return builder.dataSource(mysqlDataSource)
        .packages("com.example.demo.model.mysql")
        .persistenceUnit("mysql")
        .build();
  }

  @Primary
  @Bean(name = "mysqlTransactionManager")
  public PlatformTransactionManager transactionManager(final @Qualifier("mysqlEntityManagerFactory")
                                   LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory) {
    return new JpaTransactionManager(mysqlEntityManagerFactory.getObject());
  }
}

secondary

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.example.demo.repository.oracle",
    entityManagerFactoryRef = "oracleEntityManagerFactory", transactionManagerRef = "oracleTransactionManager")
public class OracleDataSourceConfiguration {
  @Bean(name = "oracleDataSourceProperties")
  @ConfigurationProperties("spring.second.datasource")
  public DataSourceProperties dataSourceProperties() {
    return new DataSourceProperties();
  }

  @Bean
  @ConfigurationProperties("spring.second.datasource.configuration")
  public DataSource oracleDataSource(@Qualifier("oracleDataSourceProperties") DataSourceProperties oracleDataSourceProperties) {
    return oracleDataSourceProperties.initializeDataSourceBuilder()
        .type(HikariDataSource.class)
        .build();
  }

  @Bean(name = "oracleEntityManagerFactory")
  public LocalContainerEntityManagerFactoryBean oracleEntityManagerFactory(
      EntityManagerFactoryBuilder builder, @Qualifier("oracleDataSource") DataSource oracleDataSource) {
    return builder.dataSource(oracleDataSource)
        .packages("com.example.demo.model.oracle")
        .persistenceUnit("oracle")
        .build();
  }

  @Bean
  public PlatformTransactionManager oracleTransactionManager(
      final @Qualifier("oracleEntityManagerFactory")
          LocalContainerEntityManagerFactoryBean oracleEntityManagerFactory) {
    return new JpaTransactionManager(oracleEntityManagerFactory.getObject());
  }
}

總結(jié)

當(dāng)僅有一個數(shù)據(jù)源時,Spring Boot會默認(rèn)自動配置好,但是如果使用多個數(shù)據(jù)源時,需要進(jìn)行一些自定義的配置,以上便是全部的配置。

到此這篇關(guān)于SpringBoot多數(shù)據(jù)庫連接(mysql+oracle)的實現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot多數(shù)據(jù)庫連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 新手易懂的Java客戶管理小項目

    新手易懂的Java客戶管理小項目

    本篇文章是作為一個很適合新手閱讀的初級小項目,客戶管理,它主要實現(xiàn)數(shù)據(jù)庫的增刪查改操作,管理每位客戶的不同信息,如果你也是開始學(xué)Java不久,這篇文章將很適合你
    2021-11-11
  • 使用Mybatis實現(xiàn)分頁效果示例

    使用Mybatis實現(xiàn)分頁效果示例

    大家好,本篇文章主要講的是使用Mybatis實現(xiàn)分頁效果示例,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • springboot aspect通過@annotation進(jìn)行攔截的實例代碼詳解

    springboot aspect通過@annotation進(jìn)行攔截的實例代碼詳解

    這篇文章主要介紹了springboot aspect通過@annotation進(jìn)行攔截的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Jmeter如何獲取jtl文件中所有的請求報文詳解

    Jmeter如何獲取jtl文件中所有的請求報文詳解

    JMeter的可以創(chuàng)建一個包含測試運行結(jié)果的文本文件,這些通常稱為JTL文件,因為這是默認(rèn)擴(kuò)展名,但可以使用任何擴(kuò)展名,這篇文章主要給大家介紹了關(guān)于Jmeter如何獲取jtl文件中所有的請求報文的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Spring MVC文件配置以及參數(shù)傳遞示例詳解

    Spring MVC文件配置以及參數(shù)傳遞示例詳解

    這篇文章主要給大家介紹了關(guān)于Spring MVC文件配置以及參數(shù)傳遞的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • java性能優(yōu)化之代碼緩存優(yōu)化

    java性能優(yōu)化之代碼緩存優(yōu)化

    這篇文章主要介紹了java性能優(yōu)化之代碼緩存優(yōu)化,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • maven的pom.xml中profiles的作用詳解

    maven的pom.xml中profiles的作用詳解

    這篇文章主要介紹了maven的pom.xml中profiles的作用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • mybatis多個plugins的執(zhí)行順序解析

    mybatis多個plugins的執(zhí)行順序解析

    這篇文章主要介紹了mybatis多個plugins的執(zhí)行順序解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Springboot使用RestTemplate調(diào)用第三方接口的操作代碼

    Springboot使用RestTemplate調(diào)用第三方接口的操作代碼

    這篇文章主要介紹了Springboot使用RestTemplate調(diào)用第三方接口,我只演示了最常使用的請求方式get、post的簡單使用方法,當(dāng)然RestTemplate的功能還有很多,感興趣的朋友可以參考RestTemplate源碼
    2022-12-12
  • Java?Servlet實現(xiàn)表白墻的代碼實例

    Java?Servlet實現(xiàn)表白墻的代碼實例

    最近用Servlet做了個小項目,分享給大家,下面這篇文章主要給大家介紹了關(guān)于Java?Servlet實現(xiàn)表白墻的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02

最新評論