使用Hibernate 5.2.12连接Oracle 11g遇“Logon denied”错误求助
解决Hibernate连接Oracle 11g时的"Logon denied"异常
我之前也碰到过这种糟心的情况——明明用户名密码都对,Hibernate就是连不上Oracle报登录拒绝。别慌,咱们一步步来排查,大概率是某个细节没注意到:
1. 先确认Oracle用户的状态与权限
Oracle用户很容易被锁定,比如默认新建用户可能处于锁定状态,或者多次输错密码触发了自动锁定。你可以用sys用户登录Oracle执行以下SQL检查:
SELECT username, account_status FROM dba_users WHERE username = '你的用户名';
如果查询结果里account_status是LOCKED(TIMED)或者LOCKED,那先解锁并重置密码(哪怕你觉得密码正确,重置一下更保险):
ALTER USER 你的用户名 ACCOUNT UNLOCK; ALTER USER 你的用户名 IDENTIFIED BY 你的密码;
2. 核对JDBC URL的格式与正确性
Oracle 11g的JDBC URL有两种常见格式,别搞混了:
- 薄驱动(推荐):
jdbc:oracle:thin:@//<主机名>:<端口>/<服务名> - 旧SID格式:
jdbc:oracle:thin:@<主机名>:<端口>:<SID>
你可以通过lsnrctl status命令查看Oracle监听里的服务信息,确认是用服务名还是SID,然后对应调整hibernate.connection.url。另外注意端口默认是1521,别写错主机名或者端口号。
3. 检查Hibernate配置文件的细节
- 先确认
hibernate.connection.username和hibernate.connection.password有没有多余的空格!我之前就栽过这个坑,复制粘贴的时候不小心带了空格,看起来没问题但就是连不上。比如这种错误:<!-- 错误示例:密码末尾有空格 --> <property name="hibernate.connection.password">mySecurePassword </property> - 驱动类要设置正确:Oracle 11g对应的驱动类是
oracle.jdbc.OracleDriver,确保hibernate.connection.driver_class配置没错。 - 方言设置:Hibernate 5.2.x没有专门的Oracle 11g方言,用
org.hibernate.dialect.Oracle10gDialect就完全兼容。
4. 用纯JDBC测试排除Hibernate的问题
写个极简的JDBC测试类,绕过Hibernate直接连Oracle,看看是不是Hibernate的配置问题:
import java.sql.Connection; import java.sql.DriverManager; public class OracleJdbcTest { public static void main(String[] args) { String jdbcUrl = "jdbc:oracle:thin:@//localhost:1521/orcl"; // 换成你的URL String dbUser = "你的用户名"; String dbPass = "你的密码"; try { Class.forName("oracle.jdbc.OracleDriver"); Connection conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); System.out.println("JDBC连接成功!说明问题不在Oracle端"); conn.close(); } catch (Exception e) { e.printStackTrace(); System.out.println("JDBC也连不上,那问题出在Oracle配置或网络上"); } } }
如果JDBC能连上,那再回头检查Hibernate的配置;如果JDBC也失败,就专注排查Oracle本身的问题。
5. 确认Oracle监听服务是否正常
- Windows上:打开服务列表,找到
OracleOraDb11g_home1TNSListener,确认它是启动状态。 - Linux上:执行
lsnrctl status查看监听状态,如果没启动就用lsnrctl start启动。
监听没启动的话,肯定连不上数据库,会出现登录拒绝或者连接超时。
6. 检查防火墙设置
如果Oracle数据库在远程服务器上,本地或者服务器的防火墙可能挡住了1521端口。可以临时关闭防火墙测试一下,或者在防火墙上添加1521端口的放行规则。
按照这个顺序排查,应该能快速定位到问题所在。
内容的提问来源于stack exchange,提问作者Ambar Dudhane
相关产品推荐
相关产品推荐

