SpringBoot同时连接MySQL和Oracle两个数据源

前言

之前做的项目中,需要用到MySQL和Oracle两个数据库来做数据源,在项目中配置的时候遇到了很多小坑,在这里记录一下,项目代码放到了自己的GitHub仓库中https://github.com/modelike/springboot-mysql-orcale


一、pom文件

pom文件中需要引入Mysql和Oracle的依赖

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-data-jpaartifactId>
       dependency>
       <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>5.1.21version>
        dependency>
        <dependency>
			<groupId>com.oraclegroupId>
			<artifactId>ojdbc6artifactId>
			<version>11.2.0.4.0version>
		dependency>

这里需要注意的一点是,Oracle的maven依赖需要手动导入Oracle手动导入步骤。

二、配置文件(application.properties)

在配置文件中进行端口号,两个数据源以及jpa的配置,这里的datasource是通过face和vehicle来区分,当然也可以根据项目需要来取名字:

##端口号,可以在不发生冲突的情况下随意替换
server.port=9010
##MySQL使用的是本机的3306端口,用户名和密码根据实际的来填写
spring.datasource.face.url=jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8
spring.datasource.face.username=
spring.datasource.face.password=
spring.datasource.face.driverClassName=com.mysql.jdbc.Driver
##Oracle使用的是本机的1521端口,,用户名和密码根据实际的来填写
spring.datasource.vehicle.url=jdbc:oracle:thin:@localhost:1521:orcl
spring.datasource.vehicle.username=
spring.datasource.vehicle.password=
spring.datasource.vehicle.driverClassName=oracle.jdbc.driver.OracleDriver

##jpa的配置是通用的,可以不用改
spring.jpa.open-in-view=false
spring.jpa.properties.javax.persistence.validation.mode= none
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.jdbc.time_zone=UTC

Oracle数据库的jdbc连接方式有三种(springboot.datasource.url所需要填写的内容):
1.ServiceName方式:

jdbc:oracle:thine:@<host>:<port>/<ServiceName>

2.SID方式:

jdbc:oracle:thine:@<host>:<port>:<SID>

3.TNSName方式:

jdbc:oracle:thin:@<TNSName>

本项目中使用的是SID方式

三、项目结构

项目的目录结构如下,根据所连接数据源的不同分别设置了face和vehicle,这两个目录分别包含了自己的bean,config,entity和repository层,controller层和service层是共用的。
SpringBoot同时连接MySQL和Oracle两个数据源_第1张图片

四、config目录

在这个项目中,由于存在两个数据源,所以需要进行显式的数据源配置(Springboot默认只有一个数据源),这里以face目录下的config目录为例。

package com.example.recognition.face.config;

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "faceEntityManagerFactory", transactionManagerRef = "faceTransactionManager", basePackages = {"com.example.recognition.face.repository"})
public class FaceConfig {
    
    //加载配置文件中与face有关的数据源信息
    @Primary//@Primary是设置优先,因为有多个数据源,在没有明确指定用哪个的情况下,会用带有primary的,这个注解必须有一个数据源要添加
    @Bean(name = "faceDataSourceProperties")
    @ConfigurationProperties("spring.datasource.face")
    public DataSourceProperties faceDataSourceProperties() {
        return new DataSourceProperties();
    }
    //配置数据源
    @Primary
    @Bean(name = "faceDataSource")
    @ConfigurationProperties("spring.datasource.face.configuration")
    public DataSource faceDataSource(@Qualifier("faceDataSourceProperties") DataSourceProperties faceDataSourceProperties) {
        return faceDataSourceProperties.initializeDataSourceBuilder()
                .type(HikariDataSource.class)
                .build();
    }
    //配置连接工厂
    @Primary
    @Bean(name = "faceEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("faceDataSource") DataSource facedataSource) {
        return builder
                // 设置数据源
                .dataSource(facedataSource)
                //设置实体类所在位置.扫描所有带有@Entity 注解的类
                .packages("com.example.recognition.face.entity")
                // Spring会将EntityManagerFactory注入到Repository之中.有了EntityManagerFactory之后,
                // Repository就能用它来创建EntityManager了,然后EntityManager就可以针对数据库执行操作
                .persistenceUnit("face")
                .build();
    }
    //配置事务管理
    @Primary
    @Bean(name = "faceTransactionManager")
    public PlatformTransactionManager faceTransactionManager(@Qualifier("faceEntityManagerFactory") LocalContainerEntityManagerFactoryBean faceEntityManagerFactory) {
        return new JpaTransactionManager(faceEntityManagerFactory.getObject());
    }
}

你可能感兴趣的:(spring,boot,java,mysql,oracle)