Spring Boot 3 连接 Oracle 23c Free 关键是用 ojdbc11 驱动、URL 必须用服务名 /XEPDB1(非 SID)、显式关闭 oracle.net.disableOob 等不兼容特性,并解锁 HR 用户。

Spring Boot 3 连接 Oracle Database 23c Free(即 Oracle 23c Express Edition)的关键不是换驱动,而是用对驱动版本 + 关闭不兼容特性 + 显式指定服务名。Oracle 23c Free 默认只开一个服务 XEPDB1,且不启用 ORCL 传统实例名,直接套旧配置必连不上。
必须用 oracle.jdbc:ojdbc11,不能用 ojdbc8 或 ojdbc10
Oracle 23c(包括 Free 版)要求 JDBC 驱动最低为 ojdbc11(对应 JDK 17+),ojdbc8 会报 ORA-24415: Missing username 或静默失败;ojdbc10 虽能连但不支持 23c 新增的 JSON relational duality 等特性,且在 Spring Boot 3.2+ 上触发连接池初始化异常。
- 在
pom.xml中声明:<dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc11</artifactId> <version>23.10.0.0</version> </dependency>
- 不要用
ojdbc8或从老项目 copy 的ojdbc6.jar—— 它们连 23c Free 的监听器都握手失败 - 确认本地 Maven 仓库中该 JAR 的
META-INF/MANIFEST.MF含Implementation-Version: 23.10.0.0
application.yml 里 service-name 比 sid 更关键
Oracle 23c Free 默认安装后只有一个可插拔数据库 XEPDB1,它通过服务名(service name)暴露,不是 SID。用 spring.datasource.url=jdbc:oracle:thin:@localhost:1521:ORCL 必然报 ORA-12514: TNS:listener does not currently know of service requested in connect descriptor。
- 正确写法是:
spring: datasource: url: jdbc:oracle:thin:@localhost:1521/XEPDB1 username: hr password: hr driver-class-name: oracle.jdbc.driver.OracleDriver - 注意 URL 中的
/XEPDB1—— 斜杠开头表示 service name 模式;冒号结尾(如:ORCL)才是 SID 模式 - 如果改过监听配置,可通过
lsnrctl status查看实际注册的服务名,别硬记默认值
Free 版必须显式关闭 Oracle RAC 和高级队列特性
Spring Boot 3 自动配置的 HikariCP 连接池会尝试调用 setNetworkTimeout 和 createXAConnection,而 Oracle 23c Free 不支持 XA 和部分 RAC 相关 API,导致启动时报 java.sql.SQLException: Invalid operation for read only resultset: getConcurrency 或连接池卡死。
- 在
application.yml加强制关闭项:spring: datasource: hikari: data-source-properties: oracle.net.disableOob: true oracle.jdbc.useFetchSizeWithLongColumn: false oracle.jdbc.autoCommitSpecCompliant: false - 尤其
oracle.net.disableOob是必须项:它禁用 Oracle 的 out-of-band 中断机制,Free 版监听器对此响应异常 - 避免设置
spring.jpa.database-platform=org.hibernate.dialect.OracleDialect—— 它会触发 Hibernate 尝试探测 RAC,改用org.hibernate.dialect.OracleDialect的子类Oracle21cDialect(Spring Boot 3.2+ 自动选)
最常被跳过的一步:Oracle 23c Free 安装后,HR 用户默认是 locked 且 expired。连得上不代表查得到——先用 SQL*Plus 或 SQL Developer 以 sys 登录,执行 ALTER USER hr ACCOUNT UNLOCK IDENTIFIED BY hr;,再确认 SELECT status FROM dba_users WHERE username = 'HR'; 返回 OPEN。否则 Spring Boot 启动时看似成功,首次查询直接抛 ORA-28000: the account is locked。


















