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
通信)
版本:
有没有人知道有什么办法可以避免这个例外?加载2个不同的JDBC驱动程序有问题吗?阅读其他一些类似的问题,我得到的印象是这不应该是一个问题
只需澄清几点:
提前致谢
我差点忘了回答我的问题
所以这个问题很可能与这个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。这是正确的。我开始使用准备声明的: 有时我会在日志中收到司机的警告: 这个警告很有道理,但我不确定应该如何重用? 我是否应该在构造函数/初始化方法中创建我所有的准备语句,而不是简单地使用它们? 但是,当多个线程同时使用相同的时(特别是调用来绑定对象),这种情况会很好吗?