有趣的 Oracle JDBC 驱动包命名问题 - ojdbc6 和 ojdbc14 哪个新?!

2024-06-20 19:20

本文主要是介绍有趣的 Oracle JDBC 驱动包命名问题 - ojdbc6 和 ojdbc14 哪个新?!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有趣的 Oracle JDBC 驱动包命名问题 - ojdbc6 和 ojdbc14 哪个新?!

1 背景概述

最近协助一个小兄弟排查了某作业使用 sqoop 采集 oracle 数据的失败问题,问题现象,问题原因和解决方法都挺直观,但在此过程中发现了一个有趣的 Oracle JDBC 驱动包命名问题,不留意还真不好发现,故在次跟大家分享下。

2 问题现象

  • 某 sqoop import 作业导入 oracle 数据到 hdfs 时失败,核心报错提示 oracle jdbc 驱动找不到相关方法,如下所示:
- ERROR manager.OracleManager: Could not find method setSessionTimeZone in oracle.jdbc.driver.T4CConnection 
- java.lang.NoSuchMethodException:oracle.jdbc.driver.T4CConnection.setDefaultTimeZone(java.util. TimeZone);
  • 因为历史原因,该产品部分老版本还在使用老旧的 sqoop 技术栈,新版本已经切换使用了datax/spark等方案,大家在此不用纠结这点,事实上,该 Oracle JDBC 驱动版本问题,适用于所有 ORACLE 同步工具;
  • oracle jdbc 驱动找不到相关方法,详细报错日志如下:

23/11/15 10:58:40 INF.sqoop.Sqoop: Running sqoop version: 1.4.6-cdh5.16.1
23/11/15 10:58:40 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead. 
23/11/15 10:58:40 INFO oracle.OraOopManagerFactory: Data Connector for Oracle and Hadoop is disabled.
23/11/15 10:58:40 INFO manager.SqlManager: Using default fetchSize of 1000
23/11/15 10:58:40 INFO tool. CodeGenTool: Beginning code generation
23/11/15 10:58:40 ERROR manager.OracleManager: Could not find method setSessionTimeZone in oracle.jdbc.driver.T4CConnection java.lang.NoSuchMethodException:oracle.jdbc.driver.T4CConnection.setDefaultTimeZone(java.util. TimeZone)at java.lang.Class.getMethod(Class.java.1786)at org.apache.sqoop.manager.OracleManager.setSessionTimeZone(OracleManager.java:407)at org.apache.sqoop.manager.OracleManager.makeConnection(OracleManager.java:341)at org.apache.sqoop.manager.GenericJdbcManager.getConnection(GenericJdbcManager.java:52)at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:762)at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:785)at org.apache.sqoop.manager.SqlManager.getColumnInfoForRawQuery(SqlManager.java:288)at org.apache.sqoop.manager.SqlManager.getColumnTypesForRawQuery(SqlManager.java:259)at org.apache.sqoop.manager.SqlManager.getColumnTypesForQuery(SqlManager.java:252)at org.apache.sqoop.manager.ConnManager.getColumnTypes(ConnManager.java:342)at org.apache.sqoop.orm.ClassWriter.getColumnTypes(ClassWriter.java:1858)at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1657)at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:106)at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:494)at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:621)at org.apache.sqoop.sqoop.run(Sqoop.java:147)at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)at org.apache.sqoop.sqoop.runSqoop(Sqoop.java:183)at org.apache.sqoop.sqoop.runTool(Sqoop.java:234)at org.apache.sqoop.sqoop.runTool(Sqoop.java:243)at org.apach.sqoop.sqoop.main(Sqoop.java:252)
23/11/15 10:58:40 ERRO.manager.SqlManager: Error executing statement: java.sql.SQLException: java.lang.NoSuchMethodException:oracle.jdbc.driver.T4CConnection.setDefaultTimeZone(java.util.TimeZone)
Java.sql.SQLException: java.lang.NoSuchMethodException: oracle.jdbc.driver.T4CConnection. setDefaultTimezone(java.util.Timezone) at org.apache.sqoop.manager.OracleManager.setSessionTimeZone(OracleManager.java:412)at org.apache.sqoop.manager.OracleManager.makeConnection(OracleManager.java:341)at org.apache.sqoop.manager.GenericJdbcManager.getConnection (GenericJdbcManager.java:52)at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:762)at org.apache.sqoop.manager.SqlManager.execute(SqlManager.java:785)at org.apache.sqoop.manager.SqlManager.getColumnInfoForRawQuery(SqlManager.java:288)

3. 问题原因

问题原因很简单:

  • sqoop 默认会在 $SQOOP_HOME/lib 目录下添加 mysql jdbc 相关驱动,但因为版权原因不会添加 ORACLE JDBC 相关驱动;
  • 用户手动添加 ORACLE JDBC 驱动时,应该使用 ojdbc6.jar,而不是 ojdbc14.jar,同时各个 worker 节点上述目录下,都要有添加上述驱动,而不是只有1个节点;
  • 问题原因的底层技术背景是,org.apache.sqoop.manager.OracleManager.setSessionTimeZone(OracleManager.java:412) 使用反射调用了 OracleConnection 类的方法 setSessionTimeZone;(Need to use reflection to call the method setSessionTimeZone on the OracleConnection class because oracle specific java libraries are not accessible in this context),其底层又会调用方法 setDefaultTimeZone, 在 ojdbc6.jar 中有该方法,而 ojdbc14.jar 没有该方法;
  • ojdbc14.jar 其实是2005年左右推出的,是针对 JDK1.4/JDK1.5的,而不是针对 JDK14的,ORACLE 官方也早就不支持该版本的驱动了;

4. 问题解决

问题解决也很简单,删除各个节点目录 $SQOOP_HOME/lib 下的 ojdbc14.jar,并上传 ojdbc6.jar 即可.

5. 盘点下 ORACLE JDBC 驱动常见版本及其对应的 JDK 版本

  • ORACLE JDBC 驱动的命名,一直以来遵循的都是 ojdbcx.jar,其中x代表最初针对的JDK版本;
  • 目前市面上可见的 ORACLE JDBC 驱动,及其对应的 JDK 版本如下:
ORACLE JDBC 驱动版本主要适配的JDK版本
ojdbc5.jarJDK5
ojdbc6.jarJDK6
ojdbc7.jarJDK7
ojdbc8.jarJDK8/JDK11
ojdbc11.jarJDK11/JDK17/JDK19/JDK21
ojdbc14.jarJDK1.4, 不是 JDK14!
  • 从上图可知,目前主要使用的 ORACLE JDBC 驱动版本有, ojdbc6.jar/ojdbc7/ojdbc8.jar/ojdbc11.jar;
  • 从上图可知,ojdbc14.jar 是2005年左右推出的,针对的是 JDK1.4,而不是 JDK14!!!
  • Oracle官方有说明:Since Oracle Database 11g Release 1, support for a version of JDK earlier than version 5.0 has been removed. Also, the ojdbc14.jar, ojdbc5.jar and classes12.jar files are no longer shipped. Instead, you can use the ojdbc6.jar and ojdbc7.jar files, which are shipped with Oracle Database 12c;



这篇关于有趣的 Oracle JDBC 驱动包命名问题 - ojdbc6 和 ojdbc14 哪个新?!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1079029

相关文章

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复