当前位置: 首页 > 知识库问答 >
问题:

同时使用Hive和MySql JDBC驱动程序

暨曾笑
2023-03-14

TL;DR:同时使用Hive和MySql JDBC有问题吗?

我正在开发一个应用程序,它使用MySql JDBC驱动程序执行多个SQL查询,然后它还使用Hive JDBC发送另一个Hive查询。

现在发生的情况是,MySql查询正常工作,当代码尝试执行配置单元查询时,它会抛出以下异常:

com.mysql.cj.core.exceptions.WrongArgumentException: Connector/J cannot handle a database URL of type 'jdbc:hive2:'.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:54)
    at com.mysql.cj.core.conf.url.ConnectionUrl$Type.fromValue(ConnectionUrl.java:149)
    at com.mysql.cj.core.conf.url.ConnectionUrl.getConnectionUrlInstance(ConnectionUrl.java:193)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:195)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)
    at company.services.HiveV2Provider.createConnection(HiveProvider.scala:105)
    at company.services.HiveProvider$class.loanConnection(HiveProvider.scala:66)

现在,在抛出这个异常之后,查询将正确执行。

我的猜测是,由于我同时加载了MySql和Hive驱动程序,MySql驱动程序试图首先运行这个查询,但当它遇到Hive URL时,它会抛出这个异常,然后Hive驱动程序会看到它并正确地执行查询

这就是我执行MySql代码的方式:

val query = ... // query is created here
var mysqlConn: Connection = null
var stmt: Statement = null
try {
  Class.forName("com.mysql.jdbc.Driver")
  mysqlConn = DriverManager.getConnection(mysqlAddress, username, password)
  stmt = mysqlConn.createStatement()
  val rs = stmt.executeQuery(query)
  val returnVal = someResultSetHandlingFunction(rs)
  rs.close()
  returnVal
} catch {
  case NonFatal(e) =>
    logWarning(s"Failed to execute query on: $mysqlAddress", e)
    throw e
} finally {
  if (mysqlConn != null) {
    mysqlConn.close()
  }
}

我的配置单元代码看起来只有驱动程序名为:org.apache.Hive.jdbc.hivedRiver时才相同(它与jdbc:hive2:/someURL通信)

版本:

  • 配置单元为hive-jdbc-1.1.0-cdh5.7.1
  • MySQL是mysql-connector-java 6.0.4

有没有人知道有什么办法可以避免这个例外?加载2个不同的JDBC驱动程序有问题吗?阅读其他一些类似的问题,我得到的印象是这不应该是一个问题

只需澄清几点:

  • 我知道直接使用JDBC可能不是最好的方法,但我正在检查一些内容,并且JDBC可以执行此任务
  • 我正在使用Scala,但我认为这对这个问题并不重要

提前致谢

共有1个答案

解明辉
2023-03-14

我差点忘了回答我的问题

所以这个问题很可能与这个bug有关。当我面对这个问题时,我没有注意到它只是一个堆栈跟踪打印,而不是一个实际的失败,所以它的问题比我预期的要少。

不管怎样,我看到在一些特定的版本中这个问题已经修复了,正如您在这里看到的,所以我只是将我的mysql版本更改为5.1.9(因为我不需要更高的版本来处理任何特定的事情),堆栈跟踪失败也就消失了。

如果有人能有更好的解决办法,我会很高兴的

干杯

 类似资料:
  • 我试图使用servlet上的Java驱动程序连接到托管在mlab上的MongoDB数据库。 问题是我得到以下错误: 这样做对吗?我还应该做什么/代替吗?

  • 我有一个java程序正在使用HortonWorks的JDBC驱动程序连接到VirtualBox中的数据库。一切都运行得很好,但我在sql查询中的冒号有问题。 我正在尝试设置的rowid是“:rowid:”。我在前面和后面添加冒号,使列名对于其他应用程序是唯一的。现在冒号必须在那里,我想知道是否有一种方法使用官方站点的Hortonworks JDBC Driver for Apache Hive(v

  • 问题内容: 我正在尝试使用servlet上的Java驱动程序连接到mlab上托管的MongoDB数据库。 问题是我遇到以下错误: 我看了一个答案(如何解决ClassNotFoundException:com.mongodb.connection.BufferProvider?),该答案向我强调了我需要其他jar,自从我下载了这些jar之后,仍然出现此错误。 我正在使用Eclipse并将这三个jar

  • 的配置在中正确 我还使用cli检查了 null Kubernetes版本(使用):1.7.3 云提供商或硬件配置**:4核16G RAM 操作系统(例如来自/etc/os-release):CentOS Linux 7(核心) 内核(例如):Linux 10-8-108-92 3.10.0-327.22.2.el7.x86_64#1 SMP Thu Jun 23 17:05:11 UTC 2016

  • 问题内容: 我不知道该在哪里写东西,于是决定在这里做。 长时间调试我的程序后,我发现调用Driver.getConnection(string,string,string)挂起了调用线程。为什么(?),我真的不知道,但是我发现这是在Java 1.6.0_29而不是Java 1.6.0_26发生的。 完整的环境: 操作系统:在redhat 6.1和Windows 2008上均经过测试 驱动程序:MS

  • 我目前正在使用Cassandra 2的Datastax Cassandra驱动程序来执行cql3。这是正确的。我开始使用准备声明的: 有时我会在日志中收到司机的警告: 这个警告很有道理,但我不确定应该如何重用? 我是否应该在构造函数/初始化方法中创建我所有的准备语句,而不是简单地使用它们? 但是,当多个线程同时使用相同的时(特别是调用来绑定对象),这种情况会很好吗?