一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何解决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 实例处于关闭状态。连接池连登录界面都进不去,不是配置问题,是数据库服务压根没跑起来。

  1. 先在服务器上执行 lsnrctl status,看监听器是否运行;如果报 “TNS-12541: TNS:no listener”,说明监听没启,用 lsnrctl start 启动
  2. 监听正常但还是报错?直接进 SQL*Plus 试:sqlplus / as sysdba,然后执行 startup —— 如果提示 “ORACLE instance started”,说明实例之前是 shutdown immediate 过的,现在已拉起
  3. startup 失败并报 “ORA-01078: failure in processing system parameters”,检查 $ORACLE_HOME/dbs/spfile<sid>.orainit<sid>.ora 是否存在、权限是否为 oracle 用户可读

ORA-01017:用户名密码不对,或用户被锁

Spring Boot 启动时报 “Access denied for user”,但你确认密码没错?别急,Oracle 的密码区分大小写,且 11g 默认密码策略会锁定连续输错 10 次的用户。

  1. 用 DBA 账号(如 sys)登录后查:SELECT username, account_status FROM dba_users WHERE username = 'YOUR_USER';,如果返回 LOCKED,执行 ALTER USER YOUR_USER ACCOUNT UNLOCK;
  2. 确认用户默认表空间是否在线: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;
  3. JDBC URL 中不要加 ?useUnicode=true&characterEncoding=utf8 这类 MySQL 参数,Oracle 会忽略甚至干扰认证流程

驱动版本和依赖冲突:ojdbc6 不等于能跑通 11g

Oracle 11g 最新支持 ojdbc6(11.2.0.4),但 Spring Boot 2.3+ 默认倾向 ojdbc8,混用会导致 ClassCastException 或静默失败。

  1. Maven 里必须显式排除掉传递引入的 ojdbc8:<exclusions><exclusion><groupId>com.oracle.database.jdbc</groupId><artifactId>ojdbc8</artifactId></exclusion></exclusions>
  2. com.oracle.database.jdbc:ojdbc6:11.2.0.4,别用老坐标 com.oracle:ojdbc6(中央仓库无授权,容易 resolve 失败)
  3. 驱动类名必须是 oracle.jdbc.OracleDriveroracle.jdbc.driver.OracleDriver 已废弃,Spring Boot 2.2+ 会直接 WARN 并可能跳过注册

HikariCP 连不上:不是配置错,是连接被 reset

Linux 上启动 Spring Boot 时抛 Connection reset by peer,日志里还夹着 “Authentication lapse 74909 ms”,这和 Oracle 无关,是 JVM 在生成 SecureRandom 时卡在熵池枯竭。

  1. 启动命令加参数:-Djava.security.egd=file:/dev/./urandom(注意是 /dev/./urandom,不是 /dev/random
  2. 别信网上说的改 sqlnet.oraSQLNET.EXPIRE_TIME=0,那只是延长探测间隔,不解决熵问题
  3. 验证是否生效:启动后看日志里有没有 HikariPool-1 - Starting... 这行,如果卡在 “Initializing connection pool” 超过 30 秒,就是熵没配对

Oracle 11g 的坑不在语法,而在它的“老派脾气”:实例状态、用户锁死、驱动绑定、系统熵源——四个环节任意一个断了,连接就彻底哑火。调试时别一上来就翻 application.yml,先确认数据库进程活着、用户能登、驱动能加载、JVM 不卡住,再谈 SQL 层问题。

热门栏目