UNIX 上与 Oracle DB 的 Java getConnection 崩溃或花费的时间比 Windows 上长得多

Posted

技术标签:

【中文标题】UNIX 上与 Oracle DB 的 Java getConnection 崩溃或花费的时间比 Windows 上长得多【英文标题】:Java getConnection to Oracle DB on UNIX crashed or takes much longer than on Windows 【发布时间】:2011-09-07 15:06:38 【问题描述】:

我确实有一个大问题!我使用“DriverManager.getConnection(url,properties)”打开与 Oracle 数据库的连接。 在 UNIX 机器上(当前在 VM 上),问题发生在 99% 的情况下,函数返回连接需要几分钟。我增加了 oracle 的连接超时,这样我就不会收到 SQLException,但它最多需要 3 分钟才能获得连接。在我的 Windows 机器上,连接会在 1 秒内返回。

telnet 到服务器 + 端口工作,ping 成功,traceroute 看起来不错。我还尝试了多个虚拟机或不同物理机器上的不同数据库。

我运行实际的 JDBC 驱动程序“ojdbc6-11.2.0.2.0.jar”。

谁有好主意?

【问题讨论】:

你能分享你的 JDBC 连接 URL 吗? 它是:"jdbc:oracle:thin:@192.168.1.100:1523:sid" - 刚刚编辑了 sid 和 ip 【参考方案1】:

经过很长时间,我们发现了问题所在。 Oracle JDBC 驱动程序在读取唯一 ID 时被阻塞。设置 VM 参数后

-Djava.security.egd=file:/dev/urandom

我们可以保证始终在适当的时间内收到唯一标识。不幸的是,如果机器有足够的熵,默认的 /dev/random 只会生成一个 uniqueid,而这在虚拟机上通常会丢失。

也许有一天这会对你们中的一些人有所帮助。

【讨论】:

【参考方案2】:

这有点奇怪,但可能是反向 DNS 问题。

如果您的 Oracle 服务器在 unix 上,请尝试以下操作:

$ host IP_ADDRESS_OF_WIN_MACHINE
$ host IP_ADDRESS_OF_LINUX_MACHINE

看看这两个名称解析是否有不同之处。如果有,那么尝试在 LINUX IP 上进行反向 DNS 查找可能会花费太长时间。

这件事发生在我身上。

【讨论】:

Oracle 服务器在 Windows 上运行。名称已正确解析。我还尝试使用带有主机名和 ip 的 JDBC 连接 URL。 不是名称解析的问题。这可能是 REVERSE NAME RESOLUTION 的问题。 您可以在服务器上尝试使用 tcpdump。查看每个配置的连接数据包到达的确切时刻。 nslookup 对 ip 直接返回一个名字。稍后尝试 tcpdump。

以上是关于UNIX 上与 Oracle DB 的 Java getConnection 崩溃或花费的时间比 Windows 上长得多的主要内容,如果未能解决你的问题,请参考以下文章

Oracle与DB2的区别

Oracle DB - 从 19c 客户端连接 11gR2 DB - ORA-12650:没有通用加密或数据完整性算法

otl库(以前不知道有这个库,并且还可以在Unix下使用)

Unix机器上的Tessart4j

检查 Oracle DB .shellscript 作业中的大量记录超时

使用 Java 为 DB2 和 Oracle 插入 BLOB