最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何解决Spring Boot连接Oracle 11g失败
时间:2026-08-21 09:22:48 编辑:袖梨 来源:一聚教程网
ORA-01034和ORA-27101同时出现表明Oracle实例未启动,根本原因是共享内存未分配;需先检查ora_pmon进程是否存在、alert日志报错、/dev/shm大小及kernel.shmall/shmmax参数,并用sqlplus / as sysdba执行startup确认实例状态。
ORA-01034 和 ORA-27101 报错:实例根本没起来
这两个错误同时出现,基本等于 Oracle 实例处于关闭状态。连接池连登录界面都进不去,不是配置问题,是数据库服务压根没跑起来。
- 先在服务器上执行
lsnrctl status,看监听器是否运行;如果报 “TNS-12541: TNS:no listener”,说明监听没启,用lsnrctl start启动 - 监听正常但还是报错?直接进 SQL*Plus 试:
sqlplus / as sysdba,然后执行startup—— 如果提示 “ORACLE instance started”,说明实例之前是shutdown immediate过的,现在已拉起 - 若
startup失败并报 “ORA-01078: failure in processing system parameters”,检查$ORACLE_HOME/dbs/spfile<sid>.ora或init<sid>.ora是否存在、权限是否为 oracle 用户可读
ORA-01017:用户名密码不对,或用户被锁
Spring Boot 启动时报 “Access denied for user”,但你确认密码没错?别急,Oracle 的密码区分大小写,且 11g 默认密码策略会锁定连续输错 10 次的用户。
- 用 DBA 账号(如
sys)登录后查:SELECT username, account_status FROM dba_users WHERE username = 'YOUR_USER';,如果返回LOCKED,执行ALTER USER YOUR_USER ACCOUNT UNLOCK; - 确认用户默认表空间是否在线:
SELECT tablespace_name, status FROM dba_tablespaces WHERE tablespace_name = (SELECT default_tablespace FROM dba_users WHERE username = 'YOUR_USER');,若 status 是OFFLINE,需 DBA 执行ALTER TABLESPACE xxx ONLINE; - JDBC URL 中不要加
?useUnicode=true&characterEncoding=utf8这类 MySQL 参数,Oracle 会忽略甚至干扰认证流程
驱动版本和依赖冲突:ojdbc6 不等于能跑通 11g
Oracle 11g 最新支持 ojdbc6(11.2.0.4),但 Spring Boot 2.3+ 默认倾向 ojdbc8,混用会导致 ClassCastException 或静默失败。
- Maven 里必须显式排除掉传递引入的 ojdbc8:
<exclusions><exclusion><groupId>com.oracle.database.jdbc</groupId><artifactId>ojdbc8</artifactId></exclusion></exclusions> - 用
com.oracle.database.jdbc:ojdbc6:11.2.0.4,别用老坐标com.oracle:ojdbc6(中央仓库无授权,容易 resolve 失败) - 驱动类名必须是
oracle.jdbc.OracleDriver,oracle.jdbc.driver.OracleDriver已废弃,Spring Boot 2.2+ 会直接 WARN 并可能跳过注册
HikariCP 连不上:不是配置错,是连接被 reset
Linux 上启动 Spring Boot 时抛 Connection reset by peer,日志里还夹着 “Authentication lapse 74909 ms”,这和 Oracle 无关,是 JVM 在生成 SecureRandom 时卡在熵池枯竭。
- 启动命令加参数:
-Djava.security.egd=file:/dev/./urandom(注意是/dev/./urandom,不是/dev/random) - 别信网上说的改
sqlnet.ora加SQLNET.EXPIRE_TIME=0,那只是延长探测间隔,不解决熵问题 - 验证是否生效:启动后看日志里有没有
HikariPool-1 - Starting...这行,如果卡在 “Initializing connection pool” 超过 30 秒,就是熵没配对
Oracle 11g 的坑不在语法,而在它的“老派脾气”:实例状态、用户锁死、驱动绑定、系统熵源——四个环节任意一个断了,连接就彻底哑火。调试时别一上来就翻 application.yml,先确认数据库进程活着、用户能登、驱动能加载、JVM 不卡住,再谈 SQL 层问题。