一、背景

因项目要求,第一次部署了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 的坑相关推荐

  1. oracle 错误码大全

    # 错误码 中文释义 英文释义 1 ORA-00001 违反唯一约束条件 (.) unique constraint (string.string) violated 2 ORA-00017 请求会话 ...

  2. oracle 错误码1438,一次ora-01438错误的处理

    昨天数据库出了个问题,俺这个非专业摸索了半天,终于解决了,把过程罗列出来,希望有人能用得上. 一.问题概述 在进行数据库例行维护时,遇到数据库正常导出,但导入时遇到有张表不能导入的问题.这张表存储工艺 ...

  3. oracle 错误码

    1.ORA-28000: the account is locked. 某用户被锁定. 解决方法: conn sys as sysdab; //以dba身份登录 alter  user scott a ...

  4. oracle常见错误码

    oracle常见错误码总结 ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ...

  5. oracle批量插入报错,[数据库]Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA

    [数据库]Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA 0 2020-08-19 08:00:06 Mybatis 批量插入数据 关于Oracle 批量插入报错:ORA-009 ...

  6. 500错误码,前端开发遇到的小坑

    500错误码 前端开发 先给大家放一下工程开发中遇到的问题截图: 500错误码的官方解释是: 500服务器内部错误(Internal server error)主要是由于IWAM账号的密码错误造成的. ...

  7. libcurl中上传文件的坑-英文操作系统中文路径无法上传返回26错误码

    libcurl中上传文件的坑-英文操作系统中文路径无法上传返回26错误码 最近在使用libcurl使用表单形式上传本地文件,自己测试的时候都没有问题,但是在测试的电脑上无法上传,返回26错误码,在li ...

  8. oracle 基本异常的练习及各个错误码

    DECLAREv_deptno emp.deptno%TYPE :=&deptno;v_sal emp.sal%TYPE;v_empno emp.empno%TYPE; BEGINSELECT ...

  9. 钉钉E应用开发踩过的小坑之钉钉官网有两个全局错误码链接,啥区别??

    童鞋们注意下: 做钉钉平台内部开发的有没有注意到官网有两个全局错误码链接(我只看到两个目前): https://open-doc.dingtalk.com/microapp/serverapi2/np ...

最新文章

  1. 矩阵分解法做推荐系统
  2. 互联网不互联,挡住淘菜菜?
  3. 电脑f2还原系统步骤_使用冰点还原电脑每次重启都会还原,打造一个百毒不侵的系统...
  4. XML—— XSL 转换
  5. 数字时钟设计verilog_数字IC设计基本概念之创建时钟
  6. 外设驱动库开发笔记9:SHT1x系列温湿度传感器驱动
  7. 一切为了开放科学!Papers with Code新增CS、物理、数学、统计学等多个学科
  8. vagrant使用_使用Vagrant的初学者指南
  9. 谈谈asp.net中的% %,%= %,%# %%$ %的使用
  10. 使用EF框架的增删改查和分页的公共类
  11. for update引发了血案
  12. 用PowerShell收集服务器日检报告,并发邮件给管理员
  13. 高级计量经济学及stata应用_推荐使用的计量经济学教材
  14. Python几十行代码轻松实现微信自动回复机器人
  15. 基于微信小程序评选投票系统 开题报告
  16. 搜狗新闻文本分析实例代码
  17. Scrcpy投屏软件教程(将手机内容投屏到电脑上)
  18. 幸福的小故事,愿岁月安好
  19. 输入身高体重测身材_【测试】你的身材标准吗? 附赠20-39岁成年人身高体重评分标准...
  20. python os.getcwd用法_os.getcwd()

热门文章

  1. padStart(),padEnd()方法
  2. 基于SpringBoot的毕业论文管理系统的设计与实现(开题报告)
  3. ubuntu进行MNN编译
  4. 数据项组成数据元素,数据元素组成数据
  5. Graphviz解决图论简单画图
  6. 迈向更小的.NET 4-有关客户端配置文件和下载.NET的详细信息
  7. 11+++各类计算机病毒介绍
  8. Visual Studio 中使用万能头文件 #include bits/stdc++.h
  9. 横河/YOKOGAWA 集散控制系统(DCS)
  10. Android面试题及答案3