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

前言

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


一、pom文件

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
       </dependency>
       <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.21</version>
        </dependency>
        <dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc6</artifactId>
			<version>11.2.0.4.0</version>
		</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层是共用的。
在这里插入图片描述

四、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());
    }
}

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值