问题描述:

程序中需要使用JDBC的方式同时访问Hive和MySQL,发现在获取MySQL连接的时候(DriverManager.getConnection方法)出现Hive的类中的Bad URL format异常。

代码如下:

 public Connection getMySqlConn() {Connection conn = null;try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection(ConstantUtil.mysqlUrl, ConstantUtil.mysqlUsername, ConstantUtil.mysqlPassword);} catch (ClassNotFoundException e) {logger.error(e.getMessage(), e);} catch (SQLException e) {logger.error(e.getMessage(), e);}return conn;}

异常如下:

java.lang.IllegalArgumentException: Bad URL formatat org.apache.hive.jdbc.Utils.parseURL(Utils.java:185)at org.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:84)at org.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:104)at java.sql.DriverManager.getConnection(DriverManager.java:664)at java.sql.DriverManager.getConnection(DriverManager.java:247)at com.xxx.util.MySqlUtil.getMySqlConn(MySqlUtil.java:33)at com.xxx.interceptor.TransformInterceptor.refreshApp(TransformInterceptor.java:151)at com.xxx.interceptor.TransformInterceptor.initialize(TransformInterceptor.java:42)at org.apache.flume.interceptor.InterceptorChain.initialize(InterceptorChain.java:74)at org.apache.flume.channel.ChannelProcessor.initialize(ChannelProcessor.java:68)at org.apache.flume.source.PollableSourceRunner.start(PollableSourceRunner.java:70)at org.apache.flume.lifecycle.LifecycleSupervisor$MonitorRunnable.run(LifecycleSupervisor.java:249)at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)at java.lang.Thread.run(Thread.java:745)

原因分析:

DriverManager.getConnection方法会使用url去尝试访问每个注册的JDBCDriver的connect方法,而JDBC的规范中要求该方法要判断url是否能够处理,不能处理要返回null。
然而,hive-jdbc在0.11.0版本中(具体受影响的版本范围未分析),调用其connect方法时,在url前缀非hive的情况下,是直接抛出IllegalArgumentException,而这个异常DriverManager并不会捕获,导致程序直接报错,不再尝试正确的MySQL的Driver。

解决办法:

(1)新版本的HiveJdbcDriver已修改这个问题。即先判断url前缀是否可以处理(处理不了返回null),并且将parseURL的异常修改为SQLException的子类(DriverManager会捕获)。
(2)将调用的代码改为,先获取你需要的Driver,再调用具体Driver的connect方法,这样DriverManager就不会去尝试调用每个Driver的connect方法了。代码如下:

public Connection getMySqlConn() {Connection conn = null;try {Class.forName("com.mysql.jdbc.Driver");Driver driver = DriverManager.getDriver(ConstantUtil.mysqlUrl);java.util.Properties info = new java.util.Properties();info.put("user", ConstantUtil.mysqlUsername);info.put("password", ConstantUtil.mysqlPassword);conn = driver.connect(ConstantUtil.mysqlUrl, info);} catch (ClassNotFoundException e) {logger.error(e.getMessage(), e);} catch (SQLException e) {logger.error(e.getMessage(), e);}return conn;}

HiveJDBC与其他JDBC一起使用时出现java.lang.IllegalArgumentException: Bad URL format相关推荐

  1. yml:java.lang.IllegalArgumentException: Could not resolve placeholder ‘jdbc.driverClassName‘

    第一天学spring Boot遇到的配置问题 org.springframework.beans.factory.BeanCreationException: Error creating bean ...

  2. springboot+jpa+mysql Springboot+jpa+jdbc+sqlserver 使用时遇到的一系列的问题

    更改背景 正在做一个微信小程序的前后端项目,一开始使用的是springboot+jpa+mysql,但负责接受数据存入数据库的负责人执意要用sqlserver.本来微信小程序前端,以及spring b ...

  3. jdbc连接sqlserver报错java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver...

    使用2008的数据库, 我已经引入的sqljdbc4的包,单还是报这个错,很奇怪突然想到在配置hibernate的时候,是拷贝下来的代码 然后到网上查了下, 因为是2008的版本驱动和2000的有点不 ...

  4. JDBC:PreparedStatement与Statement在使用时的区别

    PreparedStatement与Statement在使用时的区别 1.Statement: a.写sql语句 b.然后再执行executeUpdate(sql)或executeQuery(sql) ...

  5. 前端 重构时需要注意的事项_驾驶式扫地车的功能特点和使用时需要注意事项...

    扫地车 随着经济的发展,人们的生活水平不断提高,对生活环境的要求也越来越高,于是许多工厂.物业.超市.社区.市政单位等开始购买扫地车来进行路面清洁.一是清洗效果好,二是效率高,可以节省人工成本.扫地车 ...

  6. 有没搞错?Java 对象不使用时要赋值为 null?

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 许多Java开发者都曾听说过"不使用的对象应手动赋 ...

  7. 主成分分析(Principle Component Analysis)PCA的核心思想是什么?PCA算法的优缺点?增量PCA模型, 随机PCA, 模型、 核化PCA分别是什么?使用时如何选择?

    主成分分析(Principle Component Analysis)PCA的核心思想是什么?增量PCA模型, 随机PCA, 模型. 核化PCA分别是什么?使用时如何选择? 主成分分析(Princip ...

  8. 场效应管的判别、检测及使用时的注意事项!

    一.用指针式万用表对场效应管进行判别 1)用测电阻法判别结型场效应管的电极 根据场效应管的PN结正.反向电阻值不一样的现象,可以判别出结型场效应管的三个电极.具体方法:将万用表拨在R×1k档上,任选两 ...

  9. Mybatis使用时因jdbcType类型大小写书写不规范导致的异常

    Mybatis使用时因jdbcType类型大小写书写不规范导致的异常 参考文章: (1)Mybatis使用时因jdbcType类型大小写书写不规范导致的异常 (2)https://www.cnblog ...

最新文章

  1. Mybatis入门:3(动态sql)
  2. python 元组是有序不可变的类型
  3. S2系统相关-uptime命令总结(S代表系统相关)
  4. 机器学习和深度学习资料整理
  5. centos 安装mysql时错误unknown variable #39;defaults-file=/opt/redmine-2.6.0-2/mysql/my.cnf#39;...
  6. SQLite.NET (32位) 在64位环境中无法正常调试
  7. Javascript模块化编程(二)AMD规范(规范使用模块)
  8. es6中的let声明变量与es5中的var声明变量的区别,局部变量与全局变量
  9. 第7章 XSL高级应用
  10. 解散群通知怎么写_德云社演员私联初二女生,随后德云社全员退出粉丝群,什么情况?...
  11. linux 网卡驱动编译安装包,Dell R720 安装debian系统编译网卡驱动
  12. 「测绘知识」高等级道路竖曲线的精确计算方法
  13. 《社会心理学》第一章读书笔记
  14. 解决vue页面四周有白边的问题
  15. html语言span标签,html 中span标签里面都能放那些标签??
  16. css-绘制平行四边形
  17. 【MATLAB-app】如何使用键盘回调以及在app设计中应用
  18. @Column中的length属性和@Size和@length区别
  19. excel数据透视表_Excel数据透视表可轻松实现总计
  20. Heyue推出车用125℃贴片电解电容HG

热门文章

  1. 使用Docker安装Spark集群(带有HDFS)
  2. 朴素容斥原理[ZJOI2016][bzoj4455]小星星
  3. C++输入、输出优化模板整理
  4. VC 编译器的C++关键字 __super
  5. 简略图解:输入 url 到出现页面,浏览器做了什么?
  6. Python 获取指定文件夹下的目录和文件
  7. 解决IDEA本地仓库有jar包却无法引用和打包问题
  8. Linux Kernel TCP/IP Stack|Linux网络硬核系列
  9. 面试官给我挖坑:a[i][j] 和 a[j][i] 有什么区别?
  10. Java多线程知识小抄集(一)