You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中如何配置只读Oracle数据库(仅查询,不执行MySQL迁移脚本)

Spring Boot 多数据源配置(只读Oracle + 原有MySQL)

1. 配置文件新增Oracle数据源

在application.yml或application.properties中添加Oracle的配置项,与原有MySQL配置区分开,同时开启连接池只读属性:

spring:
  datasource:
    # 原有MySQL主数据源
    mysql:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/your_mysql_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
      username: root
      password: your_mysql_pwd
    # 新增只读Oracle数据源
    oracle:
      driver-class-name: oracle.jdbc.OracleDriver
      url: jdbc:oracle:thin:@//localhost:1521/your_oracle_db
      username: oracle_user
      password: oracle_pwd
      hikari:
        read-only: true

2. 注册数据源Bean

创建配置类,分别注册两个数据源,用@Primary标记MySQL为主数据源(确保迁移脚本、原有业务默认使用它):

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

@Configuration
public class MultiDataSourceConfig {

    @Primary
    @Bean(name = "mysqlDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.mysql")
    public DataSource mysqlDataSource() {
        return new HikariDataSource();
    }

    @Bean(name = "oracleDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.oracle")
    public DataSource oracleDataSource() {
        return new HikariDataSource();
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager mysqlTransactionManager() {
        return new DataSourceTransactionManager(mysqlDataSource());
    }
}

3. 配置Oracle专属数据操作实例

若使用JdbcTemplate

创建专属的Oracle JdbcTemplate实例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.beans.factory.annotation.Qualifier;

import javax.sql.DataSource;

@Configuration
public class OracleJdbcConfig {

    @Bean(name = "oracleJdbcTemplate")
    public JdbcTemplate oracleJdbcTemplate(@Qualifier("oracleDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

若使用MyBatis

为Oracle单独配置SqlSessionFactory和Mapper扫描:

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.yourpackage.mapper.oracle", sqlSessionFactoryRef = "oracleSqlSessionFactory")
public class OracleMyBatisConfig {

    @Bean(name = "oracleSqlSessionFactory")
    public SqlSessionFactory oracleSqlSessionFactory(@Qualifier("oracleDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/oracle/*.xml"));
        return sessionFactory.getObject();
    }
}

4. 确保迁移脚本仅作用于MySQL

如果使用Flyway/Liquibase,默认会绑定@Primary标记的MySQL数据源。若需显式指定,以Flyway为例:

spring:
  flyway:
    datasource: ${spring.datasource.mysql}
    locations: classpath:db/migration/mysql

5. 业务中使用只读Oracle数据源

在业务类中注入专属的JdbcTemplate或Mapper即可:

@Service
public class OracleQueryService {

    private final JdbcTemplate oracleJdbcTemplate;

    public OracleQueryService(@Qualifier("oracleJdbcTemplate") JdbcTemplate oracleJdbcTemplate) {
        this.oracleJdbcTemplate = oracleJdbcTemplate;
    }

    public List<Map<String, Object>> queryOracleTable() {
        String sql = "SELECT * FROM YOUR_ORACLE_TABLE";
        return oracleJdbcTemplate.queryForList(sql);
    }
}

内容的提问来源于stack exchange,提问作者ABHINAV.DEEP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:22:26