Oracle:错误码ORA-28040 的坑
一、背景
因项目要求,第一次部署了Oracle 12 C的Server,Linux CentOS版,数据库装好之后部署一个Java Web项目(A项目)去连接数据库,该Java项目之前用的Oracle是11 g版本,这次换成了12 C的版本,日志显示的错误信息如下:
ORA-28040: No matching authentication protocol
二、原因分析与修改测试
1、按照错误码在网上找了一下解决的案例,不外乎都是修改 $ORACLE_HOME\NETWORK\ADMIN\sqlnet.ora 文件,网上提供了两种版本的修改:
a、增加一行配置如下
SQLNET.ALLOWED_LOGON_VERSION=8
b、增加两行配置如下“
SQLNET.ALLOWED_LOGON_SERVER=8
SQLNET.ALLOWED_LOGON_CLIENT=8
按照这两种改法,分别进行了修改和测试,修改之后,重启了数据库监听、数据库服务和Tomcat,结果依然报 ORA-28040 错误。
2、使用PL/SQL去连接数据库,也能正常连接使用。
3、检查连接数据库的配置文件,检查结果OK。
4、考虑到Oracle不同的版本驱动jar包可能不一样,在网上看了一下Oracle 12C依赖的jar包,发现用的是 ojdbc6,A项目中依赖的也是 ojdbc6,因此版本驱动也认为OK了。
5、经项目组导师提示,使用原始的Java代码连接Oracle 12 C,使用的jar包从Oracle安装目录中获取,版本依然是 ojdbc6,测试结果发现能连上数据库。
Connection con = null;// 创建一个数据库连接PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用StatementResultSet result = null;// 创建一个结果集对象try{Class.forName("oracle.jdbc.driver.OracleDriver");// 加载Oracle驱动程序System.out.println("开始尝试连接数据库!");String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";// 127.0.0.1是本机地址,orcl是Oracle的示例String user = "c##abc";// Oracle用户名String password = "1111111";// Oracle用户名的密码con = DriverManager.getConnection(url, user, password);// 获取连接System.out.println("连接成功!");String sql = "select user from dual";// 预编译语句pre = con.prepareStatement(sql);// 实例化预编译语句result = pre.executeQuery();// 执行查询,注意括号中不需要再加参数while (result.next())// 当结果集不为空时System.out.println("用户名:" + result.getString("user"));}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();}}
代码参考:https://www.cnblogs.com/zhwl/p/3736114.html
6、使用Oracle 12C 自带的ojdbc6.jar替换A项目中依赖的ojdbc6的jar包,替换之后发现终于正常连上数据库了!
三、经验教训总结
1、Oracle的 ojdbc 6竟然还有不同的版本,而且支持的协议还不一样!
我在oracle官网上看到ojdbc6只有一个jar包,不分版本!这个ojdbc6-11.1.0.7.0.jar可以支持Oracle 11g,但是支持不了Oracle 12C,从文件大小也可以看出,ojdbc6-11.1.0.7.0.jar应该是老版本,根据版本向下兼容的原则,ojdbc6应该是兼容ojdbc6-11.1.0.7.0.jar的。
2、由于A项目之前使用的Oracle版本是 11g,替换到Oracle 12C的时候,考虑不周,虽然考虑到了驱动jar包的版本问题,却没仔细查看jar包的不同。当然,更规范的做法应该是在Oracle的版本发生更换的时候,对应的驱动jar包也一并更换,且更换的jar包从Oracle的安装目录中获取。
3、从想到驱动的问题到略过该问题,暴露了自己解决问题的思路不够细致。
4、排查该问题的思路整理:
服务器本机使用用户登录、操作数据库 | 排查用户的账号密码、权限等问题 |
PL/SQL连接Oracle | 排查网络问题 |
sqlnet.ora文件修改 | 排查ora-28040问题 |
Java连接Oracle的配置文件 | 排查连接参数 |
ojdbc驱动jar包检查与替换 | 排查驱动jar包问题和协议不匹配的问题 |
Oracle:错误码ORA-28040 的坑相关推荐
- oracle 错误码大全
# 错误码 中文释义 英文释义 1 ORA-00001 违反唯一约束条件 (.) unique constraint (string.string) violated 2 ORA-00017 请求会话 ...
- oracle 错误码1438,一次ora-01438错误的处理
昨天数据库出了个问题,俺这个非专业摸索了半天,终于解决了,把过程罗列出来,希望有人能用得上. 一.问题概述 在进行数据库例行维护时,遇到数据库正常导出,但导入时遇到有张表不能导入的问题.这张表存储工艺 ...
- oracle 错误码
1.ORA-28000: the account is locked. 某用户被锁定. 解决方法: conn sys as sysdab; //以dba身份登录 alter user scott a ...
- oracle常见错误码
oracle常见错误码总结 ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ...
- oracle批量插入报错,[数据库]Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA
[数据库]Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA 0 2020-08-19 08:00:06 Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA-009 ...
- 500错误码,前端开发遇到的小坑
500错误码 前端开发 先给大家放一下工程开发中遇到的问题截图: 500错误码的官方解释是: 500服务器内部错误(Internal server error)主要是由于IWAM账号的密码错误造成的. ...
- libcurl中上传文件的坑-英文操作系统中文路径无法上传返回26错误码
libcurl中上传文件的坑-英文操作系统中文路径无法上传返回26错误码 最近在使用libcurl使用表单形式上传本地文件,自己测试的时候都没有问题,但是在测试的电脑上无法上传,返回26错误码,在li ...
- oracle 基本异常的练习及各个错误码
DECLAREv_deptno emp.deptno%TYPE :=&deptno;v_sal emp.sal%TYPE;v_empno emp.empno%TYPE; BEGINSELECT ...
- 钉钉E应用开发踩过的小坑之钉钉官网有两个全局错误码链接,啥区别??
童鞋们注意下: 做钉钉平台内部开发的有没有注意到官网有两个全局错误码链接(我只看到两个目前): https://open-doc.dingtalk.com/microapp/serverapi2/np ...
最新文章
- 矩阵分解法做推荐系统
- 互联网不互联,挡住淘菜菜?
- 电脑f2还原系统步骤_使用冰点还原电脑每次重启都会还原,打造一个百毒不侵的系统...
- XML—— XSL 转换
- 数字时钟设计verilog_数字IC设计基本概念之创建时钟
- 外设驱动库开发笔记9:SHT1x系列温湿度传感器驱动
- 一切为了开放科学!Papers with Code新增CS、物理、数学、统计学等多个学科
- vagrant使用_使用Vagrant的初学者指南
- 谈谈asp.net中的% %,%= %,%# %%$ %的使用
- 使用EF框架的增删改查和分页的公共类
- for update引发了血案
- 用PowerShell收集服务器日检报告,并发邮件给管理员
- 高级计量经济学及stata应用_推荐使用的计量经济学教材
- Python几十行代码轻松实现微信自动回复机器人
- 基于微信小程序评选投票系统 开题报告
- 搜狗新闻文本分析实例代码
- Scrcpy投屏软件教程(将手机内容投屏到电脑上)
- 幸福的小故事,愿岁月安好
- 输入身高体重测身材_【测试】你的身材标准吗? 附赠20-39岁成年人身高体重评分标准...
- python os.getcwd用法_os.getcwd()
热门文章
- padStart(),padEnd()方法
- 基于SpringBoot的毕业论文管理系统的设计与实现(开题报告)
- ubuntu进行MNN编译
- 数据项组成数据元素,数据元素组成数据
- Graphviz解决图论简单画图
- 迈向更小的.NET 4-有关客户端配置文件和下载.NET的详细信息
- 11+++各类计算机病毒介绍
- Visual Studio 中使用万能头文件 #include bits/stdc++.h
- 横河/YOKOGAWA 集散控制系统(DCS)
- Android面试题及答案3