You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hive.apache.org by "Shi Yuxiang (JIRA)" <ji...@apache.org> on 2014/10/23 08:40:33 UTC

[jira] [Created] (HIVE-8571) Unexpected "IllegalArgumentException" from parseURL method in org.apache.hive.jdbc.Utils interrupts java.sql.driverManager running before choosing the right driver when using multiple datasource

Shi Yuxiang created HIVE-8571:
---------------------------------

             Summary: Unexpected "IllegalArgumentException" from parseURL method in org.apache.hive.jdbc.Utils interrupts java.sql.driverManager running before choosing the right driver when using multiple datasource
                 Key: HIVE-8571
                 URL: https://issues.apache.org/jira/browse/HIVE-8571
             Project: Hive
          Issue Type: Bug
          Components: JDBC
    Affects Versions: 0.10.0
         Environment: centos 6,cdh 4.3.1
            Reporter: Shi Yuxiang


My JDK is 1.6. 
I checked the source code in jdbc-hive 0.10-cdh4.3.1. I found the code in parseURL is not appropriate. When uri is not start with URL_PREFIX, parseURL will throw an exception. This exception is thrown to the outside of hive-jdbc. It will interrupt some logic outside of this driver, especially when I use multiple datesources besides hive.

if (!uri.startsWith(URL_PREFIX)) {
      throw new IllegalArgumentException("Bad URL format");
}

For example, I use mysql-connector-java and hive-jdbc to connect to mysql and hive respectively in my project. And I use java.sql.drivermanager to get connections after I initialize both hive and mysql jdbc drivers.
In java.sql.drivermanager, getconnection (...) method, we will choose the right driver according to url. In fact, it scans the driver list and tries each driver to get connection according to url. The code is like following:
for (int i = 0; i < drivers.size(); i++) {
	    DriverInfo di = (DriverInfo)drivers.elementAt(i);
	    // If the caller does not have permission to load the driver then 
	    // skip it.
	    if ( getCallerClass(callerCL, di.driverClassName ) != di.driverClass ) {
		println("    skipping: " + di);
		continue;
	    }
	    try {
		println("    trying " + di);
// ---------------------------------- try to get connection here --------------------------
		Connection result = di.driver.connect(url, info);
// ---------------------------------- if the connection is not null, return ---------------
		if (result != null) {
		    // Success!
		    println("getConnection returning " + di);
		    return (result);
		}
	    } catch (SQLException ex) {
		if (reason == null) {
		    reason = ex;
		}
	    }
	}
In this way, if I use hive.jdbc.Utils.parseURL to parse a mysql uri, parseURL will throw an IllegalArgumentException("Bad URL format"). Because drivermanager does not handler this exception, so drivermanager stops trying other drivers.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)