Spring Boot 3.x 连接 Oracle 21c 必须使用 ojdbc11(如 oracle.jdbc:ojdbc11:21.12.0.0),因 Oracle 21c 仅支持 JDBC 4.3(Java 11+),且 ojdbc11 内置 Jakarta EE 9+ 支持,而 ojdbc8 会因 JAXB 类缺失或驱动类废弃(需改用 oracle.jdbc.OracleDriver)导致连接失败。
Spring Boot 3.x 连接 Oracle 21c 必须用 ojdbc11
oracle 21c 官方只支持 jdbc 4.3(对应 java 11+),而 spring boot 3.x 默认基于 java 17,ojdbc8 在运行时会抛出 java.lang.noclassdeffounderror: javax/xml/bind/jaxbexception 或连接握手失败。必须使用 ojdbc11(即 oracle.jdbc:ojdbc11:21.12.0.0 或更高),它内置对 jakarta ee 9+(如 jakarta.xml.bind)的支持。
常见错误现象:
- 启动时报
Failed to configure a DataSource,且日志里没有明确 Oracle 驱动类加载失败提示 - 手动调用
DriverManager.getConnection(...)报java.sql.SQLException: No suitable driver found - 依赖了
ojdbc8却在application.properties里写spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver—— 该类在ojdbc11中已废弃,必须改用oracle.jdbc.OracleDriver
application.yml 中的正确配置项
Oracle 21c 默认启用 TLS 1.2+ 和密码复杂度校验,URL 格式和参数比旧版更严格。以下是最小可用配置:
spring:
datasource:
url: jdbc:oracle:thin:@//localhost:1521/FREEPDB1
username: system
password: Oracle_123
driver-class-name: oracle.jdbc.OracleDriver
sql:
init:
mode: always
schema-locations: classpath:schema-oracle.sql
关键点说明:
-
jdbc:oracle:thin:@//host:port/SERVICE_NAME是推荐格式(注意双斜杠//和末尾的 SERVICE_NAME,不是 SID);Oracle 21c Express Edition 默认服务名为FREEPDB1 - 不要加
?oracle.net.ssl_version=1.2等参数——除非你启用了 Oracle Wallet 或自定义 SSL,否则默认已安全 -
driver-class-name必须是oracle.jdbc.OracleDriver,ojdbc11不再注册旧的oracle.jdbc.driver.OracleDriver - 若用 HikariCP(Spring Boot 默认),无需额外配置连接池参数,但可加
spring.datasource.hikari.connection-timeout=20000避免首次连接超时
Maven 依赖要排除旧驱动并显式声明 ojdbc11
Spring Boot 的 spring-boot-starter-jdbc 本身不带 Oracle 驱动,但某些 starter(如 spring-boot-starter-data-jpa)可能间接拉入 ojdbc8,导致类路径冲突。
务必在 pom.xml 中显式声明且排除旧版本:
<dependency><groupid>oracle.jdbc</groupid><artifactid>ojdbc11</artifactid><version>21.12.0.0</version></dependency><dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-jdbc</artifactid><exclusions><exclusion><groupid>com.oracle.database.jdbc</groupid><artifactid>ojdbc8</artifactid></exclusion></exclusions></dependency>
注意:
- 从 Maven Central 获取
ojdbc11需先接受 Oracle 许可协议,推荐用官方仓库:oracle https://maven.oracle.com - 不要混用
com.oracle.database.jdbc:ojdbc11和oracle.jdbc:ojdbc11—— 后者是 Oracle 官方维护的 groupId,前者是 Maven Central 镜像,版本号命名略有差异 - 如果项目含 MyBatis 或 JPA,确保它们不通过 transitive 依赖引入
ojdbc8,可用mvn dependency:tree | grep ojdbc检查
连接验证与典型报错排查
启动后最简单的验证方式是加一个 @PostConstruct 方法执行 SELECT 1 FROM DUAL:
@Component
public class OracleConnectionCheck {
@Autowired DataSource dataSource;
@PostConstruct
public void test() throws SQLException {
try (var conn = dataSource.getConnection();
var stmt = conn.createStatement();
var rs = stmt.executeQuery("SELECT 1 FROM DUAL")) {
if (rs.next()) System.out.println("✅ Oracle 21c connection OK");
}
}
}
遇到连不上,优先检查这几点:
- Oracle 21c 是否已启动且监听
1521端口?运行lsnrctl status确认FREEPDB1在服务列表中 - 用户密码是否满足复杂度要求(至少 8 位、含大小写字母+数字+特殊字符)?Oracle 21c 默认启用
VERIFY_FUNCTION - 防火墙或 Docker 网络是否阻止了宿主机到容器的 1521 端口?用
telnet localhost 1521测试连通性 - 是否误把
system用户用于应用连接?建议创建专用用户并授予权限:CREATE USER appuser IDENTIFIED BY "App_123"; GRANT CONNECT, RESOURCE TO appuser;
Oracle 21c 的 JDBC 行为变化很细,比如 setAutoCommit(true) 在 PDB 下可能触发隐式事务,这类细节容易被忽略,但会在高并发场景下暴露。











