无法通过JDBC驱动连接Oracle XE:提示密码为空但实际非空
JDBC连接Oracle XE 21c提示密码为空,但代码已设置密码的问题
问题描述
使用JDBC驱动连接Oracle XE 21c时,报错ORA-01005: null password given; logon denied,但代码中明确设置了密码,SQL*Plus可正常通过该密码登录数据库。
环境信息
- JDBC驱动:ojdbc8-23.2.0.0.jar
- 数据库:Oracle XE 21c
Java代码
public class OracleConnect { public static void main(String[] args) { String url = "jdbc:oracle:thin:@//localhost:1521/XEPDB1"; String user = "constantin"; String password = "tiger"; try { Connection conn = DriverManager.getConnection(url, user, password); System.out.println("Connected to the database."); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM menagerie"); while(rs.next()) { System.out.println(rs.getInt("id")); } rs.close(); stmt.close(); conn.close(); } catch (SQLException e) { System.out.println("Could not connect to the database."); e.printStackTrace(); } } }
报错信息
Could not connect to the database. java.sql.SQLException: ORA-01005: null password given; logon denied at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:702) at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:603) at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:598) at oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:1710) at oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:819) at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:1041) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:443) at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:462) at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTHWithO5Logon(T4CTTIoauthenticate.java:1628) at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:1375) at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:1322) at oracle.jdbc.driver.T4CConnection.authenticateWithPassword(T4CConnection.java:1500) at oracle.jdbc.driver.T4CConnection.authenticateUserForLogon(T4CConnection.java:1443) at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:812) at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:1101) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:104) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:837) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:247) at ca.menagerie.core.main.OracleConnect.main(OracleConnect.java:12)
数据库初始化步骤(SQL*Plus操作)
SQL*Plus: Release 21.0.0.0.0 - Production on Wed Jun 14 02:10:21 2023 Version 21.3.0.0.0 Copyright (c) 1982, 2021, Oracle. All rights reserved. Enter user-name: / as sysdba Connected to: Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production Version 21.3.0.0.0 SQL> select name from v$pdbs; NAME -------------------------------------------------------------------------------- PDB$SEED XEPDB1 SQL> connect sys/kryptonite@localhost:1521/XEPDB1 as sysdba Connected. SQL> create user constantin identified by tiger default tablespace users quota unlimited on users; User created. SQL> grant create session, create table to constantin; Grant succeeded. SQL> connect constantin/tiger@localhost:1521/XEPDB1; Connected. SQL> create table menagerie(id number); Table created. SQL> insert into menagerie values (1234); 1 row created. SQL> commit; Commit complete. SQL> select * from menagerie; ID ---------- 1234 SQL>
解决方案尝试
按以下步骤排查解决:
确认驱动包正确引入
- 检查项目classpath,确保ojdbc8-23.2.0.0.jar已正确添加,无其他版本Oracle JDBC驱动(如ojdbc7、ojdbc6)冲突。Maven项目可确认依赖配置:
<dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>23.2.0.0</version> </dependency> - IDE中需将驱动包标记为库文件,避免缺失报错。
- 检查项目classpath,确保ojdbc8-23.2.0.0.jar已正确添加,无其他版本Oracle JDBC驱动(如ojdbc7、ojdbc6)冲突。Maven项目可确认依赖配置:
修改JDBC URL格式
尝试将用户名和密码直接嵌入URL,排除参数传递异常:String url = "jdbc:oracle:thin:constantin/tiger@//localhost:1521/XEPDB1"; Connection conn = DriverManager.getConnection(url);显式注册驱动
在获取连接前手动注册Oracle驱动,避免DriverManager自动加载失败:try { Class.forName("oracle.jdbc.OracleDriver"); Connection conn = DriverManager.getConnection(url, user, password); // 后续代码 } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); }验证JDK版本兼容性
ojdbc8要求JDK 8及以上版本,确认项目运行环境的JDK版本符合要求。检查数据库密码验证规则
执行以下SQL查看用户密码验证配置,若存在自定义验证函数,可暂时改为默认无验证后重试:SELECT profile, resource_name, limit FROM dba_profiles WHERE resource_name = 'PASSWORD_VERIFY_FUNCTION';
内容的提问来源于stack exchange,提问作者Newbie Guest
相关产品推荐
相关产品推荐

