无法使用 19.3 JDBC 驱动程序连接到 Oracle 19.3

Posted

技术标签:

【中文标题】无法使用 19.3 JDBC 驱动程序连接到 Oracle 19.3【英文标题】:Can't connect to Oracle 19.3 with 19.3 JDBC driver 【发布时间】:2019-10-10 09:02:29 【问题描述】:

我们有一个使用 Oracle 19.3 数据库运行的项目,以及一个使用 Oracle 19.3 JDBC 驱动程序(可在 Maven Central 上获得)的 Java 应用程序。在带有 JRE 1.8 的 Windows 上,一切都很好,但是当我在我们的构建服务器上或在带有 OpenJDK 11.0.3 的 WSL Ubuntu 上运行时,它拒绝连接到数据库。具体来说:

ERROR: Unexpected error
java.sql.SQLRecoverableException:
Unable to obtain connection from database (jdbc:oracle:thin:@//<host>:<port>/<db>) for user '<user>': IO Error: Invalid argument, Authentication lapse 0 ms.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL State  : 08006
Error Code : 17002
Message    : IO Error: Invalid argument, Authentication lapse 0 ms.

        at JuliasApplication.openConnection(JdbcUtils.java:60)
        ...
Caused by: java.sql.SQLRecoverableException: IO Error: Invalid argument, Authentication lapse 0 ms.
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:874)
        at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:793)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:57)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:747)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:562)
        ...
Caused by: java.io.IOException: Invalid argument, Authentication lapse 0 ms.
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:870)
        ... 12 more
Caused by: java.io.IOException: Invalid argument
        at java.base/sun.nio.ch.SocketChannelImpl.sendOutOfBandData(Native Method)
        at java.base/sun.nio.ch.SocketChannelImpl.sendOutOfBandData(SocketChannelImpl.java:521)
        at java.base/sun.nio.ch.SocketAdaptor.sendUrgentData(SocketAdaptor.java:323)
        at oracle.net.nt.TcpNTAdapter.sendUrgentByte(TcpNTAdapter.java:433)
        at oracle.net.ns.NSProtocolNIO.negotiateConnection(NSProtocolNIO.java:159)
        at oracle.net.ns.NSProtocol.connect(NSProtocol.java:340)
        at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1596)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:588)
        ... 12 more

如果我切换到 18.3 JDBC 驱动程序,这两种环境中的一切都很好;如果我切换到 18.3 数据库,那么这两种环境中的一切都很好。这确实为我们提供了一个解决方法,但我们不明白发生了什么让我们感到非常不舒服。而且我在网上找不到任何关于“身份验证失效”的信息。谁能看到任何可以解释失败的线索?

【问题讨论】:

你使用的是ojdbc10还是ojdbc8 您是否考虑联系 Oracle 寻求支持?还要检查您是否在使用其他 Oracle db 相关库(例如 UCP、nls 数据等),并确保它们都是相同的版本。 @a_horse_with_no_name ojdbc8 这仍然不起作用。有没有不降级到 ojdbc8` 的解决方法? 【参考方案1】:

看起来底层的 Socket 实现不允许 OOB。 作为一种解决方法,您可以通过将连接属性 CONNECTION_PROPERTY_THIN_NET_DISABLE_OUT_OF_BAND_BREAK 设置为“true”来禁用 OOB 检查。 请参考此链接:https://docs.oracle.com/en/database/oracle/oracle-database/20/jajdb/oracle/jdbc/OracleConnection.html#CONNECTION_PROPERTY_THIN_NET_DISABLE_OUT_OF_BAND_BREAK

上面的链接不再提到“带外中断”问题,所以这里有一些替代方案:

根据this article,将DISABLE_OOB=on 放入您的sqlnet.ora 文件中。 for your java apps 把-Doracle.net.disableOob=true 放在命令行上 for apps like SQL Developer 您可以将AddVMOption -Doracle.net.disableOob=true 添加到您的sqldeveloper.conf

【讨论】:

非常好 - 行得通!我假设这是 v19.3 驱动程序实现的更改,所以我们只需要在看到该驱动程序版本时进行设置?【参考方案2】:

我在使用 Oracle 19c docker 容器时遇到了同样的问题,在浏览了一半的互联网后,我意识到问题出在我使用 localhost 的事实作为主机,由于某种原因,19.3.0.0+ Oracle 驱动程序不支持。

使用docker网络接口的IP地址(在我的例子中为172.17.0.2)配置主机后,我可以连接到Oracle服务器。

希望这对您也有帮助。

【讨论】:

是***.com/questions/17157721/…返回的IP地址吗?我得到 172.18.0.2 但返回 The Network Adapter could not establish the connection 我使用Unix命令返回的地址:ip -4 address show | grep docker0 | grep inet | awk 'print $2' | sed -e 's@/.*@@g'【参考方案3】:

您必须使用兼容 JDK10 的 ojdbc10.jar。有关详细信息,请参阅FAQ (What are the Oracle JDBC releases Vs JDK versions?)。

19.3 ojdbc10.jar 与 JDK10、JDK11 和 ojdbc8.jar 与 JDK8、JDK9、JDK11 18.3 ojdbc8.jar 与 JDK8、JDK9、JDK10、JDK11

【讨论】:

我看了那个页面;我正在使用 OpenJDK11,它声称 ojdb8.jar 可以使用 JDK11。 (请注意,没有关于更高级别 JDK 的建议) 如果您使用的是 JDK11,则可以使用 ojdbc8.jar,因为它是使用 JDK8 编译的,但可以与 JDK10 和 JDK 11 一起使用。FAQ 将很快更新此信息。

以上是关于无法使用 19.3 JDBC 驱动程序连接到 Oracle 19.3的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 JDBC 连接到 sql 2008 express

无法使用 Impala JDBC 驱动程序通过 Java 应用程序连接到 Impala

无法使用 JDBC 连接到 docker 中的本地 MySQL

无法使用 JDBC 在 android 中连接到 sql server 2008

无法通过 jdbc 连接到 hive

无法使用 JDBC 驱动程序和 sql2o 连接到我的 Posgres 服务器