有趣的 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.rhkb.cn/news/359131.html

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

相关文章

特氟龙深水采样器FEP贝勒管水质取样器密封性好

贝勒管深水采样器(bailers tube),是一种经济型便携式水质采样器,操作简单,使用方便,性价比高,能大限度的保证样品的真实性。采样管直径很小,能够采取小口径的深水井水样。是一款简单实用,性价比高的水质采样…

C语言入门课程学习笔记8:变量的作用域递归函数宏定义交换变量

C语言入门课程学习笔记8 第36课 - 变量的作用域与生命期(上)第37课 - 变量的作用域与生命期(下)实验—局部变量的作用域实验-变量的生命期 第38课 - 函数专题练习第39课 - 递归函数简介实验-递归小结 第40课 - C 语言中的宏定义实…

C语言 while循环1

在C语言里有3种循环:while循环 do while 循环 for循环 while语句 //while语法结构 while(表达式)循环语句; 比如在屏幕上打印1-10 在while循环中 break用于永久的终止循环 在while循环中,continue的作用是跳过本次循环 …

如何安全进行亚马逊、沃尔玛测评?

在亚马逊、沃尔玛、速卖通、阿里国际站等电商平台上,测评已成为一种高效的推广手段,但伴随的风险也不容忽视。这些风险主要源于平台严格的大数据风控机制,它涵盖了多个方面,以确保评价的真实性和合规性。 首先,硬件参数…

Avalonia 常用控件二 Menu相关

1、Menu 添加代码如下 <Button HorizontalAlignment"Center" Content"Menu/菜单"><Button.Flyout><MenuFlyout><MenuItem Header"打开"/><MenuItem Header"-"/><MenuItem Header"关闭"/&…

Unity贪吃蛇改编【详细版】

Big and small greedy snakes 游戏概述 游戏亮点 通过对称的美感&#xff0c;设置两条贪吃蛇吧&#xff0c;其中一条加倍成长以及加倍减少&#xff0c;另一条正常成长以及减少&#xff0c;最终实现两条蛇对整个界面的霸占效果。 过程中不断记录两条蛇的得分情况&#xff0c…

如何配置taro

文章目录 step1. 全局安装wepacksetp2. 使用npm安装tarostep3. 项目初始化 使用taro时需要在本地配置好nodejs环境&#xff0c;关于如何配置nodejs可参考我的这篇博文 如何配置nodejs环境 step1. 全局安装wepack 使用指令npm install webpack -g即可 安装完成后可看到有wepa…

十大经典排序算法——选择排序和冒泡排序

一、选择排序 1.基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据全部排完。 2.直接选择排序 (1) 在元素集合arr[i] — arr[n - 1]中选择关键妈的最大&#xff08;小…

GaussDB关键技术原理:高性能(二)

GaussDB关键技术原理&#xff1a;高性能&#xff08;一&#xff09;从数据库性能优化系统概述对GaussDB的高性能技术进行了解读&#xff0c;本篇将从查询处理综述方面继续分享GaussDB的高性能技术的精彩内容。 2 查询处理综述 内容概要&#xff1a;本章节介绍查询端到端处理的…

AI大模型企业应用实战(18)-“消灭”LLM幻觉的利器 - RAG介绍

大模型在一定程度上去改变了我们生活生工作的思考的方式&#xff0c;然后也越来越多的个人还有企业在思考如何将大模型去应用到更加实际的呃生产生活中去&#xff0c;希望大语言模型能够呃有一些更多企业级别生产落地的实践&#xff0c;然后去帮助我们解决一些业务上的问题。目…

汉语拼音字母表 (声母表和韵母表)

汉语拼音字母表 [声母表和韵母表] 1. 汉语拼音声母表2. 汉语拼音韵母表References 1. 汉语拼音声母表 声母是韵母前的辅音&#xff0c;与韵母一起构成一个完整的音节。 辅音是发声时&#xff0c;气流在口腔中受到各种阻碍所产生的声音&#xff0c;发音的过程即是气流受阻和克…

玩转Matlab-Simscape(初级)- 10 - 基于COMSOLSimulink 凸轮机构的控制仿真

** 玩转Matlab-Simscape&#xff08;初级&#xff09;- 10 - 基于COMSOL&Simulink 凸轮机构的控制仿真 ** 目录 玩转Matlab-Simscape&#xff08;初级&#xff09;- 10 - 基于COMSOL&Simulink 凸轮机构的控制仿真 前言一、简介二、在Solidworks中创建3D模型&#xff…

Springboot拦截器使用及其底层源码剖析

博主最近看了一下公司刚刚开发的微服务&#xff0c;准备入手从基本的过滤器以及拦截器开始剖析&#xff0c;以及在帮同学们分析一下上次的jetty过滤器源码与本次Springboot中tomcat中过滤器的区别。正题开始&#xff0c;拦截器顾名思义是进行拦截请求的一系列操作。先给大家示例…

H4020 12V24V36V40V1A 同步降压芯片IC Buck-DCDC 低功耗,高效率 100%占空比

H4020是一款12V24V36V40V1A的同步降压&#xff08;Buck&#xff09;DC-DC转换器&#xff0c;专为需要高效率、低功耗和精确电压/电流控制的应用而设计。它内置了高压MOSFET&#xff0c;支持宽范围的输入电压&#xff08;5V-36V&#xff09;&#xff0c;并能提供高达1A的持续输出…

汇编快速入门

一.基础知识 1.数据类型 DB&#xff08;Define Byte&#xff0c;字节类型 占位8位bit 1字节&#xff09; 范围&#xff1a;DB可以用来定义&#xff08;无符号、有符号&#xff09;整数&#xff08;包含二、十、十六进制&#xff09;和字符 语法&#xff1a;a DB 数据个数…

“人工智能+”带来新变化

以生成式人工智能&#xff08;AIGC&#xff09;为代表的新一代人工智能技术创新加速演进&#xff0c;相关商业化应用成果也不断涌现&#xff0c;行业应用范围不断拓展&#xff0c;深度赋能实体经济&#xff0c;为行业提质增效与实现减排提供助力。 自主航运初创公司OrcaAI于6月…

g++制作C++动态库的简洁例程

g制作C动态库的简洁例程 code review! 文章目录 g\制作C动态库的简洁例程1. 创建 C 动态库1.1 动态库源文件1.2 编译动态库 2. 使用动态库2.1 命令行编译链接然后运行2.2 使用 CMake 编译链接然后运行 3.附加笔记&#xff1a;关于运行时是否能找到libmylib.so的问题汇总3.1.g -…

STM32项目分享:智能窗帘系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.c…

浅析缓存技术

缓存技术的原理 缓存技术通过在内存中存储数据副本来加速数据访问。当应用程序需要数据时&#xff0c;首先检查缓存是否存在数据副本&#xff0c;如果有则直接返回&#xff0c;否则再从原始数据源获取。这种机制大大减少了访问时间&#xff0c;提升了系统的响应速度和整体性能。…

谷歌手机刷机教学

注意&#xff1a;手机已经解开了oem锁和bl 1、adb基础命令 连接设备adb devices&#xff1a;列出当前连接的所有设备。 adb connect <设备IP>&#xff1a;通过IP地址连接设备&#xff08;用于无线连接&#xff09;。 设备信息adb shell getprop&#xff1a;获取设备的所…