有趣的 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;



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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kylin系列:架构和高级功能详解

目录 一、Kylin的架构 1.1 总体架构概述 1.2 数据源 1.3 元数据存储 1.4 构建引擎 1.5 存储引擎 1.6 查询引擎 1.7 用户接口 二、Kylin的高级功能 2.1 多维立方体(Cube) 2.1.1 Cube的定义 2.1.2 Cube的构建 2.2 查询优化 2.3 数据模型和星型模式 2.3.1 数据模…

使用SPI驱动数码管

代码&#xff1a; 7-seg.c /*《AVR专题精选》随书例程3.通信接口使用技巧项目&#xff1a;改进的延时法实现半双工软件串口文件&#xff1a;7seg.c说明&#xff1a;SPI控制数码管驱动文件作者&#xff1a;邵子扬时间&#xff1a;2012年12月15日*/#include <avr/io.h>ex…

Ubuntu:解决github出现 Permission denied (publickey)的问题

因为使用的Ubuntu 长久没有使用&#xff0c;使用下载的时候突然报错&#xff0c;使用ssh key这种方式进行clone &#xff0c;pull github上面的项目&#xff0c;使用 git clone或者git pull origin master出现permission denied (publickey)&#xff0c;原因是因为ssh key过期失…

0 知识的补充

目录 矢量运算 矢量加法 矢量减法 矢量点乘 矢量叉乘 矢量混合积 坐标系 直角坐标系 柱坐标系 球坐标系 ​​​​​​​ 矢量运算 矢量加法 矢量减法 矢量点乘 矢量叉乘 ​​​​​​​ 矢量混合积 坐标系 直角坐标系 柱坐标系 ​​​​​​​ 球坐标系

高速缓存存储器(Chche)

为了解决CPU和主存之间速度不匹配的问题&#xff0c;计算机系统中引入了高速缓存&#xff08;Chche&#xff09;的概念。 基本想法&#xff1a;使用速度更快但容量更小、价格更高的SRAM制作一个缓冲存储器&#xff0c;用来存放经常用到的信息&#xff1b;这样一来&#xff0c;…

Chrome插件: Octotree让你GitHub代码浏览速度飙升

在GitHub上浏览和管理项目代码时&#xff0c;您是否曾为复杂的目录结构感到困惑&#xff1f;如果有一种工具能够让您轻松浏览项目的文件和目录&#xff0c;会不会大大提升您的工作效率&#xff1f;这正是Octotree浏览器插件所能做到的。 不过说实话&#xff0c;GitHub自带的代码…

HMI 的 UI 风格,超凡脱俗

HMI 的 UI 风格&#xff0c;超凡脱俗

ARM功耗管理软件之WFIWFE

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理软件栈及示例&#xff1f;WFI&WFE&#xff1f;时钟&电源树&#xff1f;DVFS&AVS&#xff1f; ARM功耗管理精讲与实战汇总参见&#xff1a;Arm功耗管理精讲与实战

java中Object和json相互转换的方式

1.org中jackson转换json,springboot中内置jackson ObjectMapper onew ObjectMapper(); List<>listnew ArrayList(); String jonso.writeAsValueString(list); 2.alibaba中fastjson转换成json GetMapping("/test")public TbUser testHttpClient(){String url…

Day11 —— 大数据技术之Spark

Spark快速入门系列 Spark的概述什么是Spark&#xff1f;Spark的主要特点Spark的主要组件 Spark安装Spark三种运行模式Spark Standalone架构Spark Standalone的两种提交方式Spark On YARN架构 RDD算子转化算子行动算子 Spark RDDRDD的创建从对象集合创建RDD从外部存储创建RDD Sp…

[C/C++][VsCode]使用VsCode在Linux上开发和Vscode在线调试

目录 0. 前言1. win10上搭建环境Linux环境2.编写makefile3.怎么在线调试结语 0. 前言 在开发中&#xff0c;可以一边开发一边调试&#xff0c;这样可以大大的减少bug&#xff1b;但是正常来说一个大点的项目&#xff0c;是不太可能单步调试的&#xff0c;因为一般都是用make或…

java打印金字塔paremid和空心金字塔

java打印金字塔 首先确定每行打印几个空格&#xff0c;在确定每行打印几个* 设总层数为layers&#xff0c;当前层数为i。 则每行打印空格数layers-i&#xff0c;每行打印星号数2*i-1 import java.util.Scanner;public class Paremid{public static void main(String[] args) …

基于Pico和MicroPython点亮ws2812彩色灯带

基于Pico和MicroPython点亮ws2812彩色灯带 文章目录 基于Pico和MicroPython点亮ws2812彩色灯带IntroductionPracticeConclusion Introduction 点亮发光的LED灯是简单有趣的实验&#xff0c;点亮多个ws2812小灯串联起来的灯带&#xff0c;可对多个彩色小灯进行编程&#xff0c;…

夏季城市内涝防治:视频汇聚系统智能AI技术助力城市自然灾害应急管理

据新闻报道&#xff0c;6月19日至20日&#xff0c;受强降雨影响&#xff0c;广西桂林城区及周边等地出现今年入汛以来持续时间最长、累计降水量最大、影响范围最广、致灾风险最高的暴雨天气过程&#xff0c;导致桂林市区多处发生洪水内涝&#xff0c;房屋被淹、道路受阻、人员被…

ES全文检索支持繁简和IK分词检索

ES全文检索支持繁简和IK分词检索 1. 前言2. 引入繁简转换插件analysis-stconvert2.1 下载已有作者编译后的包文件2.2 下载源码进行编译2.3 复制解压插件到es安装目录的plugins文件夹下 3. 引入ik分词器插件3.1 已有作者编译后的包文件3.2 只有源代码的版本3.3 安装ik分词插件 4…

【pytorch04】创建Tensor

numpy中的数据创建tensor 数据已经在numpy中了&#xff0c;将numpy中的数据转到tensor中来&#xff0c;因为我们将使用tensor在GPU上进行加速运算 从NUMPY导入的FLOAT其实是DOUBLE类型 list中的数据创建tensor FloatTensor()和大写的Tensor()接收的是shape&#xff08;即数据的…

JAVA学习过程中遇到的问题

前言 记录学习过程中遇见的各种问题。希望对你有帮助。 目录 前言 1、新建maven项目时&#xff0c;archetype项目骨架加载慢 2、maven的pop.xml添加依赖项无法检测到 3、java: 无效的目标发行版: 20 4、idea添加maven依赖太慢 5、CTRLCV复制粘贴太慢 6、Swagger写接口文…

SD卡无法读取?数据恢复全攻略!

SD卡无法读取问题描述 在日常使用电子设备时&#xff0c;我们有时会遇到SD卡无法读取的情况。当插入SD卡后&#xff0c;设备可能无法识别或访问其中的数据&#xff0c;这给我们带来了诸多不便。SD卡无法读取&#xff0c;意味着存储在卡中的重要文件、照片和视频等资料可能面临…

数学建模---包汤圆问题引发的思考

1.前言 &#xff08;1&#xff09;虽然我学习这个数学建模已经很长一段时间了&#xff0c;但是我认为自己始终是一个门外汉&#xff0c;只是学习了一下这个基本的建模软件使用方法&#xff0c;以及一些相关的知识&#xff0c;虽然参加了一次这个电工杯的比赛&#xff0c;但是这…

1.Triangle

一、你好&#xff0c;三角形 在OpenGL中&#xff0c;任何事物都在3D空间中&#xff0c;而屏幕和窗口却是2D像素数组&#xff0c;这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。 3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线&#xff08;Graphi…