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

相关文章

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr