Java 8 升级后 DriverManager 无法返回连接

Posted

技术标签:

【中文标题】Java 8 升级后 DriverManager 无法返回连接【英文标题】:DriverManager unable to return connection after Java 8 upgrade 【发布时间】:2019-04-17 14:26:07 【问题描述】:

我有一个尝试连接到 Impala 和 Oracle 的应用程序。下面是定义的 2 个 bean。

Impala 驱动程序 - ImpalaJDBC41-2.5.41.jar Oracle 驱动 - ojdbc6.jar

<bean id="ID1" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName" value="com.cloudera.impala.jdbc41.Driver"/>

<property name="url" value="jdbc:impala://impalahost:21050/;AuthMech=1;KrbRealm=myrealm;KrbServicName=impala;KrbHostFQDN=xxx" />

</bean>

<bean id="ID2" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@//oraclehost:1523/DB" />
<property name="username" value="myuser" />
<property name="password" value="pwd" />
<property name="connectionProperties">
<props>
<prop key="defaultRowPrefetch">5000</prop>
</props>
</property>
</bean>

在获取带有 bean 引用的“Oracle”连接时 - ID2,得到了这个异常(令人惊讶的是它转到了 cloudera 驱动程序代码)-

==java.lang.NullPointerException
===Stack trace...
java.util.Hashtable.put(Unknown Source)
com.cloudera.jdbc.common.AbstractDriver.copyProperties(Unknown Source)
com.cloudera.jdbc.common.AbstractDriver.connect(Unknown Source)
java.sql.DriverManager.getConnection(Unknown Source)
java.sql.DriverManager.getConnection(Unknown Source) org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFrom 
DriverManager(DriverManagerDataSource.java:173) org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFrom 
Driver(DriverManagerDataSource.java:164) org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:149) org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:119) org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)

相同的配置在 Java 1.7 上也能正常工作

【问题讨论】:

与您的问题无关(否则我会感到惊讶),但如果您使用的是 Java 8,为什么要使用 ojdbc6(适用于 Java 6)?在任何情况下,java.sql.DriverManager 将遍历所有驱动程序以查看哪个驱动程序将连接。显然,Impala 驱动程序在 Oracle 驱动程序之前被检查。这似乎是 Impala 驱动程序中的一个错误。检查是否有可用的更新版本来修复它。 我尝试对两个驱动程序都使用较新的版本;它没有帮助。 那么你应该向 Impala 提交一个错误。 令人惊讶的是,它在具有相同设置的 Java 1.7 上运行良好。如果检查异常;即使应用程序尝试连接到 Oracle,代码流也会进入 impala 驱动程序并在那里失败。我尝试将 impala jar 重命名为 ZImpalaJDBC41-2.5.41.jar 并且一切正常。 Oracle 驱动程序在 Impala 之前加载。在 Java 1.8 处理这两个驱动程序的方式上,这看起来像是一个错误。 鉴于这是 Impala 内部的空指针异常,如果这是 DriverManager 中的错误,我会感到惊讶。驱动程序管理器将轮询每个驱动程序是否可以使用提供的 JDBC url 进行连接,如果不能连接,则应返回 null(如果 URL 不是驱动程序)或抛出 SQLException(如果 url 用于驱动程序,但语法上有问题,或者无法建立连接)。听起来 Impala 不检查它是否可以使用 URL,然后继续处理 URL,然后失败,因为它不是 Impala 的 URL。 【参考方案1】:

在加载 Oracle 驱动程序之前加载 Impala 驱动程序时会出现此问题;因为 ImpalaJDBC41-2.5.41.jar 在 ojdbc6.jar 之前被引用(字母顺序)。所以我有 2 个选项可以先加载 Oracle 驱动程序,并且都可以正常工作 -

    将 Impala jar 重命名为 ZImpala,以便在 ojdbc jar 之后引用它

    1234563它甚至会在我们的应用程序 EAR 部署之前加载 Oracle 驱动程序。

【讨论】:

以上是关于Java 8 升级后 DriverManager 无法返回连接的主要内容,如果未能解决你的问题,请参考以下文章

升级到 java 8 后无法使用 crashlytics 发布项目

Java学习笔记8.1.1 初探JDBC - JDBC接口与类

Java学习笔记8.1.1 初探JDBC - JDBC接口与类

如何使用 Java 8 连接到 Sybase Advantage Local DB

SSLHandshakeException:收到致命警报:Java 6 -> 8 升级后的握手失败

Java 升级后 Sonar Server 5.6 损坏