直接用spring.profiles.active控制oracle数据源加载,无需改代码或if判断;通过application-dev.yml和application-prod.yml分离配置,主application.yml仅保留公共项并默认设为dev,生产环境通过启动参数(如--spring.profiles.active=prod)动态激活,配合@profile注解确保对应数据源bean生效。
直接用 spring.profiles.active 控制 oracle 数据源加载即可,不用改代码、不写 if 判断,核心是让不同 profile 下的 @configuration 类或配置文件只在对应环境生效。
application-{profile}.yml 里配 Oracle 连接参数最稳妥
把开发和生产环境的 Oracle 配置拆到独立文件里,避免混在一起出错。注意 spring.profiles 声明不是必须的,但加上能防止误加载。
-
application-dev.yml写本地 Oracle XE 或 Docker 实例:spring: datasource: url: jdbc:oracle:thin:@localhost:1521:xe username: dev_user password: dev_pass driver-class-name: oracle.jdbc.OracleDriver -
application-prod.yml写真实集群地址,密码建议用密文或外部注入:spring: datasource: url: jdbc:oracle:thin:@prod-scan.example.com:1521/orclpdb username: app_prod password: ${ORACLE_PROD_PASSWORD:changeme} driver-class-name: oracle.jdbc.OracleDriver - 主配置
application.yml只留公共项,比如spring.profiles.active: dev作为默认值,上线前删掉或注释掉
@Profile("prod") 注解只注册生产数据源 Bean
如果要用 Java Config 管理数据源(比如集成 Druid 或 Hikari 的定制逻辑),@Profile 必须加在类或方法上,且值要和激活的 Profile 完全一致(大小写敏感)。
- 开发环境数据源类:
@Configuration @Profile("dev") public class DevDataSourceConfig { @Bean public DataSource dataSource() { return new HikariDataSource(...); // 本地轻量配置 } } - 生产环境数据源类:
@Configuration @Profile("prod") public class ProdDataSourceConfig { @Bean public DataSource dataSource() { HikariConfig config = new HikariConfig(); config.setJdbcUrl(System.getenv("ORACLE_URL")); config.setUsername(System.getenv("ORACLE_USER")); config.setPassword(System.getenv("ORACLE_PASS")); return new HikariDataSource(config); } } - 别忘了在
application.yml或启动命令里明确激活,比如--spring.profiles.active=prod,否则两个类都不会注册
Oracle 驱动版本和连接参数容易踩坑
Oracle JDBC 驱动对 Profile 切换没影响,但驱动版本和连接字符串细节会直接导致启动失败,尤其生产环境。
- Spring Boot 3.x 默认不带 Oracle 驱动,必须显式添加依赖:
com.oracle.database.jdbc:ojdbc11(JDK 17+)或ojdbc8(JDK 8–17) -
url格式必须匹配服务名或 SID:@host:port:SID(旧版) vs@host:port/service_name(12c+ 推荐),写错会报ORA-12505 - 生产环境务必加连接池参数,比如
oracle.net.CONNECT_TIMEOUT=5000和oracle.jdbc.ReadTimeout=10000,否则网络抖动时应用卡死 - 开发环境启用
spring.sql.init.mode=always自动建表,生产环境必须设为never,否则上线时清空表
CI/CD 中 profile 激活别依赖 application.yml
打包时硬编码 spring.profiles.active=prod 在 application.yml 里,等于把生产配置“锁死”进 jar 包,运维无法覆盖。真正安全的做法是运行时指定。
- Maven 打包阶段不写 active,保持 jar 包中性;用
-Dspring.profiles.active=prod启动 - K8s 部署时通过
env注入:env: - name: SPRING_PROFILES_ACTIVE value: prod
- 如果用 Jenkins Pipeline,用
withEnv(['SPRING_PROFILES_ACTIVE=prod'])更可控 - 检查是否生效:启动日志里搜
Active profiles,必须看到prod,而不是[dev, prod]这种多激活——Oracle 连接池会尝试连所有配置,导致超时失败
Profile 切换本身很简单,难的是 Oracle 连接参数在不同环境下的细微差异,比如 service_name/SID、TNS 别名、wallet 路径、SSL 配置。每次切环境前,先确认 tnsping 能通,再看 Spring Boot 日志里有没有 Established Oracle connection —— 不要等接口报 500 才发现连不上。











