Springboot+JPA+Oracle 双数据源 项目实践

一、简介

Springboot + Jpa + oracle 双数据源 在业务场景上比较常用,常用于项目中数据转换与清理,承接数据转换服务等。

二、项目创建与资源文件配置

2.1 创建springboot项目 (不赘述)

项目结构

 

2.2 pom文件 

引入 jpa,ojdbc,lombok,日志依赖等。

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.oracle.database.nls</groupId>
            <artifactId>orai18n</artifactId>
            <version>21.1.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.vladmihalcea</groupId>
            <artifactId>hibernate-types-52</artifactId>
            <version>2.9.4</version>
        </dependency>

        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.5</version>
        </dependency>

        <!--日志-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions><!-- 去掉springboot默认配置 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency> <!-- 引入log4j2依赖 -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

2.3 application.properties配置文件

多数据源配置,主数据源 primary 和次 数据源 secondary 

#oracle - primary
spring.datasource.primary.jdbc-url=第一个数据源的url
spring.datasource.primary.username=第一个数据源的username
spring.datasource.primary.password=第一个数据源的password
spring.datasource.primary.driver-class-name=oracle.jdbc.driver.OracleDriver
#oracle - secondary
spring.datasource.secondary.jdbc-url=第二个数据源的url
spring.datasource.secondary.username=第二个数据源的username
spring.datasource.secondary.password=第二个数据源的password
spring.datasource.secondary.driver-class-name=oracle.jdbc.driver.OracleDriver
# port 端口
server.port=8081

2.4数据源的配置

首先新建数据源配置 于config文件下创建DataSourceConfig,定义数据源,并且注明一个主数据源,一个从数据源.。

 

/**
 * @author yueyi
 * @Date 2021年11月26日14:49:20
 */
@Slf4j
@Configuration
public class DataSourceConfig {

    //主数据源
    @Primary
    @Bean(name = "primaryDataSource")
    @Qualifier("primaryDataSource")
    @ConfigurationProperties("spring.datasource.primary") //对应 application.properties配置文件
    public DataSource primaryDataSource() {
        log.info("主数据源primary加载");
        return DataSourceBuilder.create().build();
    }

    //次数据源
    @Bean(name = "secondaryDataSource")
    @Qualifier("secondaryDataSource")
    @ConfigurationProperties("spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        log.info("从数据源secondary加载");
        return DataSourceBuilder.create().build();
    }
}

 配置了两个数据源之后,程序会去连接这两个数据库,这样默认的连接已经不能支撑了,这个时候需要两个数据库文件告诉程序如何去连接这两个数据库。

新建两个数据库定义文件PrimaryConfig.java与SecondaryConfig.java,分别定义主从数据库。

PrimaryConfig.java

/**
 * @author yueyi
 * @Date 2021年11月26日14:55:18
 * 主数据源的配置文件
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef="entityManagerPrimary",
        transactionManagerRef="transactionManagerPrimary",
        //设置主数据库,Repository所在位置
        basePackages= {"com.yonde.dexdataconvert.primary.repository"})
public class PrimaryConfig {

    @Primary  //设置主数据库
    @Bean
    PlatformTransactionManager transactionManagerPrimary() {
        return new JpaTransactionManager(entityManagerPrimary().getObject());
    }

    @Primary    //设置主数据库
    @Bean(name = "entityManagerPrimary")
    public LocalContainerEntityManagerFactoryBean entityManagerPrimary() {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setDatabase(Database.ORACLE);
        vendorAdapter.setShowSql(true);

        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        factoryBean.setDataSource(primaryDataSource);
        factoryBean.setJpaVendorAdapter(vendorAdapter);
        //主数据源 jpa对应的实体的位置
        factoryBean.setPackagesToScan("com.yonde.dexdataconvert.primary.entity");
        return factoryBean;
    }

    @Autowired
    @Qualifier("primaryDataSource")

    private DataSource primaryDataSource;

}
SecondaryConfig.java
/**
 * @author yueyi
 * @Date 2021年11月26日14:56:31
 * 从数据源的配置文件
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef="entityManagerSecondary",
        transactionManagerRef="transactionManagerSecondary",
        //设置从数据库,Repository所在位置
        basePackages= {"com.yonde.dexdataconvert.secondary.repository"})
public class SecondaryConfig {

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


    @Bean
    PlatformTransactionManager transactionManagerSecondary() {
        return new JpaTransactionManager(entityManagerSecondary().getObject());
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerSecondary() {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setDatabase(Database.ORACLE);
        vendorAdapter.setShowSql(true);


        LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
        factoryBean.setDataSource(secondaryDataSource);
        factoryBean.setJpaVendorAdapter(vendorAdapter);
        // 从数据源 jpa实体对应位置
        factoryBean.setPackagesToScan("com.yonde.dexdataconvert.secondary.entity");
        return factoryBean;
    }


}

至此配置完成, 项目已经分包为Primary和Secondary两部分,其Repository与entity 进行分开管理。分别实现CRUD即可。

写的很好