无法使用 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