JDBC连接Oracle报错ORA-12505

本文介绍了在使用 Struts2 框架连接 Oracle 数据库时遇到的 ORA-12505 错误,并提供了正确的 JDBC 连接 URL 的配置方法。通过对比原本错误的写法和正确的写法,帮助开发者避免类似的连接问题。

时间:2017-12-19

异常:ORA-12505, TNS: listener does not currently know of SID given in connect descriptor

情景:写了一个Strust2 Demo连接Oracle数据库运行时报错,对应所用Jar为:ojdbc6.jar

原因:jdbc连接URL填写错误,

原本的写法是:jdbc:oracle:thin:@172.31.60.51:1521:SHRMS;

正确的写法是:

jdbc:oracle:thin:@(description=(address=(protocol=tcp)(port=1521)(host=172.31.60.51)(PORT = 1521))(connect_data=(SERVER = DEDICATED)(service_name=SHRMS)))

解决办法:参考这里

连接代码:

package com.qiu.util;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;


public class TestOracle {
	public void testOracle()
	{
	    Connection con = null;// 创建一个数据库连接
	    PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用Statement
	    ResultSet result = null;// 创建一个结果集对象
	    try
	    {
	        Class.forName("oracle.jdbc.driver.OracleDriver");
	        System.out.println("开始尝试连接数据库!");
	        String url = "jdbc:oracle:thin:@(description=(address=(protocol=tcp)(port=1521)(host=172.31.60.51)(PORT = 1521))(connect_data=(SERVER = DEDICATED)(service_name=SHRMS)))";
	        //String url = "jdbc:oracle:thin:@172.31.60.51:1521:SHRMS;";
	        String user = "admin";
	        String password = "password";
	        con = DriverManager.getConnection(url, user, password);
	        System.out.println("连接成功!");
	    }catch (Exception e){
	        e.printStackTrace();
	    } finally{
	        try{
	            if (result != null)
	                result.close();
	            if (pre != null)
	                pre.close();
	            if (con != null)
	                con.close();
	            System.out.println("数据库连接已关闭!");
	        }catch (Exception e){
	            e.printStackTrace();
	        }
	    }
	}
}


<think>我们正在解决JDBC连接Oracle时出现的ORA-01017错误。根据引用内容,该错误通常是由于用户名/密码无效或登录被拒绝引起的。结合多个引用,我们可以总结以下原因和解决方法:原因分析:1.用户名或密码错误(最常见原因)-引用[4][5]明确指出2.JDBC驱动版本与Oracle数据库版本不兼容-引用[1]提到ORACLE12c以上版本默认设置SQLNET.ALLOWED_LOGON_VERSION_SERVER=12,导致旧版JDBC驱动连接失败3.数据库服务配置问题-引用[2][3]涉及监听程序配置解决方法:1.验证用户名密码(基础检查):-使用SQL*Plus等工具直接登录验证-修改密码(引用[5]提供SQL命令):```sqlALTERUSER用户名IDENTIFIEDBY新密码;```2.调整数据库参数(针对版本兼容性问题):-修改sqlnet.ora文件(引用[1][2]):```SQLNET.ALLOWED_LOGON_VERSION_SERVER=8SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8```-添加兼容性参数(引用[2]):```sqlnet.authentication_services=(NTS)#Windows系统或sqlnet.authentication_services=(NONE)#Linux/Unix系统```3.检查数据库服务状态(引用[3]):-确认监听程序配置正确(listener.ora中SERVICE_NAME配置)-确保数据库实例已注册到监听程序4.更新JDBC驱动:-使用与Oracle数据库版本匹配的ojdbc驱动(如12c以上使用ojdbc8.jar)操作步骤:1.基础验证:-通过本地工具登录数据库,排除密码错误可能性2.驱动检查:-确认pom.xml/gradle中使用的ojdbc版本-Oracle12c及以上推荐ojdbc8(兼容JDK8+)3.配置文件修改(需DBA权限):-定位$ORACLE_HOME/network/admin/sqlnet.ora-添加兼容性参数(示例):```SQLNET.ALLOWED_LOGON_VERSION_SERVER=8SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8SQLNET.AUTHENTICATION_SERVICES=(NONE)```-重启监听:`lsnrctlreload`4.多租户环境注意(引用[4]):-CDB/PDB架构中需确保连接字符串指定正确PDB服务名-格式:`jdbc:oracle:thin:@//host:port/服务名`典型连接字符串示例:```java//标准SID连接jdbc:oracle:thin:@host:1521:SID//服务名连接(12c多租户推荐)jdbc:oracle:thin:@//host:1521/服务名```§§相关问题§§1.如何查询Oracle数据库当前版本?2.怎样确定JDBC驱动与Oracle数据库版本的兼容性?3.ORA-01017和ORA-28040错误有何关联?4.CDB/PDB架构下用户认证有什么特殊要求?</think>### JDBC连接Oracle出现ORA-01017错误的解决方法 #### 错误原因分析 ORA-01017错误表示**用户名/密码无效,登录被拒绝**。根据引用资料,主要原因包括: 1. **用户名或密码错误**(最常见原因)[^4][^5] 2. **JDBC驱动与数据库版本不兼容**(Oracle 12c+默认启用高版本认证协议)[^1] 3. **多租户环境(CDB/PDB)配置问题**(未正确指定PDB服务)[^4] 4. **监听程序配置错误**(如服务名未注册)[^3] 5. **密码策略冲突**(如特殊字符处理)[^5] --- ### 解决方法步骤 #### 1. 基础验证(首先执行) ```sql -- 在数据库服务器执行(需DBA权限) SELECT * FROM dba_users WHERE username = '您的用户名'; ``` - 确认用户名大小写(Oracle默认大写) - 检查密码特殊字符是否需要转义[^5] - 使用SQL*Plus本地登录测试: ```bash sqlplus 用户名/密码@服务名 ``` #### 2. 驱动版本兼容性修复(针对Oracle 12c+) **方法1:升级JDBC驱动**(推荐) - 使用匹配的驱动版本: ```xml <!-- Maven配置示例 --> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc11</artifactId> <!-- Oracle 12c-21c用ojdbc8/ojdbc11 --> <version>21.9.0.0</version> </dependency> ``` **方法2:修改数据库配置**(需DBA权限) 编辑 `$ORACLE_HOME/network/admin/sqlnet.ora`: ```ini # 降低认证协议版本 SQLNET.ALLOWED_LOGON_VERSION_SERVER=8 SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8 # 根据操作系统添加 sqlnet.authentication_services=(NTS) # Windows sqlnet.authentication_services=(NONE) # Linux[^2] ``` **重启监听生效**: ```bash lsnrctl reload ``` #### 3. 多租户环境(CDB/PDB)配置 - **连接字符串必须指定PDB服务名**: ```java // 正确格式(注意双斜杠) jdbc:oracle:thin:@//host:1521/PDB服务名 ``` - **确认用户在PDB中存在**: ```sql ALTER SESSION SET CONTAINER=PDB名称; SELECT * FROM all_users; ``` #### 4. 密码重置(DBA操作) ```sql -- 强制修改密码(忽略复杂度) ALTER USER 用户名 IDENTIFIED BY "新密码" REPLACE "旧密码"; ``` #### 5. 监听程序检查 验证监听配置 `listener.ora`: ```ini SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = 全局服务名) (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1) (SID_NAME = SID) ) ) ``` --- ### 完整诊断流程 ```mermaid graph TD A[出现ORA-01017] --> B{本地SQL*Plus能登录吗?} B -->|能| C[检查JDBC连接字符串] B -->|不能| D[重置密码] C --> E{驱动版本是否匹配?} E -->|是| F[检查监听配置] E -->|否| G[升级JDBC驱动] F --> H{是否为CDB/PDB?} H -->|是| I[确认连接PDB服务名] H -->|否| J[检查sqlnet.ora参数] ``` > **注意**:生产环境修改`sqlnet.ora`会降低安全性,优先推荐升级驱动[^1]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值