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

[jira] [Resolved] (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

     [ https://issues.apache.org/jira/browse/HIVE-8571?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Lars Francke resolved HIVE-8571.
--------------------------------
    Resolution: Duplicate

> 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)