You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法通过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>

解决方案尝试

按以下步骤排查解决:

  1. 确认驱动包正确引入

    • 检查项目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中需将驱动包标记为库文件,避免缺失报错。
  2. 修改JDBC URL格式
    尝试将用户名和密码直接嵌入URL,排除参数传递异常:

    String url = "jdbc:oracle:thin:constantin/tiger@//localhost:1521/XEPDB1";
    Connection conn = DriverManager.getConnection(url);
    
  3. 显式注册驱动
    在获取连接前手动注册Oracle驱动,避免DriverManager自动加载失败:

    try {
        Class.forName("oracle.jdbc.OracleDriver");
        Connection conn = DriverManager.getConnection(url, user, password);
        // 后续代码
    } catch (ClassNotFoundException | SQLException e) {
        e.printStackTrace();
    }
    
  4. 验证JDK版本兼容性
    ojdbc8要求JDK 8及以上版本,确认项目运行环境的JDK版本符合要求。

  5. 检查数据库密码验证规则
    执行以下SQL查看用户密码验证配置,若存在自定义验证函数,可暂时改为默认无验证后重试:

    SELECT profile, resource_name, limit FROM dba_profiles WHERE resource_name = 'PASSWORD_VERIFY_FUNCTION';
    

内容的提问来源于stack exchange,提问作者Newbie Guest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:52:01