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

Reply via email to