Spring Boot 3.x应用默认连接Oracle备库问题求助
Oracle主备库连接异常排查与解决方案
问题背景
已有多款Spring Boot应用通过LDAP URL连接Oracle主备库(主库定期切换),新开发的应用基于Spring Boot 3.4.1~3.4.5版本,部署在Linux服务器的Podman容器(无Pod)中,JDBC依赖为com.oracle.database.jdbc:ojdbc11:23.2.0.0。配置与其他正常应用完全一致,但新应用始终连接备库并抛出ORA-12514错误。
错误信息
java.sql.SQLRecoverableException: ORA-12514: Cannot connect to database. Service XXXX is not registered with the listener at host HOSTNAME port 1521. (CONNECTION_ID=xxx==) at oracle.jdbc.driver.T4CConnection.handleLogonNetException(T4CConnection.java:1099) ~[ojdbc11-23.2.0.0.jar!/:23.2.0.0.0] at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:879) ~[ojdbc11-23.2.0.0.jar!/:23.2.0.0.0] at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:1132) ~[ojdbc11-23.2.0.0.jar!/:23.2.0.0.0] at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:104) ~[ojdbc11-23.2.0.0.jar!/:23.2.0.0.0] at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:837) ~[ojdbc11-23.2.0.0.jar!/:23.2.0.0.0] at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:664) ~[ojdbc11-23.2.0.0.jar!/:23.2.0.0.0]
相关日志
2025-04-25T13:20:09.034Z INFO [custom-service,,] 1 --- [custom-service] [ main] [ ] oracle.jdbc : traceId=A1B2C3D. 2025-04-25T13:20:09.036Z INFO [custom-service,,] 1 --- [custom-service] [ main] [ ] oracle.jdbc : Session Attributes: sdu=1111, tdu=2222222 nt: host=HOSTNAME, port=1521, socketOptions={0=YES, 1=YES, 17=0, 18=false, 2=30000, 20=true, 38=TLS, 23=40, 24=50, 40=false, 25=0} socket=null client profile={oracle.net.encryption_types_client=(), oracle.net.crypto_seed=, oracle.net.authentication_services=(XXX), oracle.net.setFIPSMode=false, oracle.net.kerberos5_mutual_authentication=false, oracle.net.encryption_client=ACCEPTED, oracle.net.crypto_checksum_client=ACCEPTED, oracle.net.crypto_checksum_types_client=()} onBreakReset=false, dataEOF=false, negotiatedOptions=0x0, connected=false 2025-04-25T13:20:09.037Z INFO [custom-service,,] 1 --- [custom-service] [ main] [ ] oracle.jdbc : traceId=A1B2C3D, anoEnabled=true. 2025-04-25T13:20:09.037Z INFO [custom-service,,] 1 --- [custom-service] [ main] [ ] oracle.jdbc : Got Refused, SessionTraceId = A1B2C3D 2025-04-25T13:20:09.037Z INFO [custom-service,,] 1 --- [custom-service] [ main] [ ] oracle.jdbc : Outbound interrupt timer cancelled null 2025-04-25T13:20:09.037Z INFO [custom-service,,] 1 --- [custom-service] [ main] [ ] oracle.jdbc : Session Attributes:
当前配置
SPRING_DATASOURCE_USERNAME=XXX SPRING_DATASOURCE_PASSWORD=XXX SPRING_DATASOURCE_DRIVER_CLASS_NAME=oracle.jdbc.OracleDriver SPRING_DATASOURCE_URL=jdbc:oracle:thin:@ldap://xxx:3060/xxxx,cn=xx,dc=xx,dc=com
解决方案建议
调整JDBC URL属性,强制主库优先
在数据源URL后追加Oracle特定连接属性,指定故障转移模式与重试策略:SPRING_DATASOURCE_URL=jdbc:oracle:thin:@ldap://xxx:3060/xxxx,cn=xx,dc=xx,dc=com?oracle.net.ldap.pool=false&failover_mode=(TYPE=SESSION,METHOD=BASIC)&retry_count=3该配置会让驱动在连接失败时自动重试,并优先选择可用的主库实例。
降级ojdbc版本适配Spring Boot 3.4.x
尝试将com.oracle.database.jdbc:ojdbc11版本降级至21.13.0.0,新版本JDBC驱动可能存在LDAP解析逻辑变更,与Spring Boot 3.4.x的连接池初始化逻辑不兼容。配置连接池的连接校验与故障转移
启用HikariCP的连接有效性校验,及时剔除无效连接并重新获取:SPRING_DATASOURCE_HIKARI_CONNECTION-TEST-QUERY=SELECT 1 FROM DUAL SPRING_DATASOURCE_HIKARI_VALIDATION-TIMEOUT=5000 SPRING_DATASOURCE_HIKARI_MAX-LIFETIME=1800000 SPRING_DATASOURCE_HIKARI_LEAK-DETECTION-THRESHOLD=60000校验LDAP解析结果
手动执行LDAP查询,确认返回的数据库实例顺序是否主库在前:ldapsearch -h xxx -p 3060 -b "cn=xx,dc=xx,dc=com" "(cn=xxxx)" orclnetdescstring如果LDAP返回的备库实例优先,联系DBA调整LDAP服务注册顺序,确保主库实例排在列表首位。
针对Spring Boot #44516 Bug的适配
该Bug涉及数据源初始化时的连接属性传递问题,可添加以下配置强制传递Oracle连接属性:SPRING_DATASOURCE_HIKARI_DATA-SOURCE-PROPERTIES=oracle.net.ldap.pool:false;oracle.net.retry_count:3
内容的提问来源于stack exchange,提问作者Murat K.
相关产品推荐
相关产品推荐

