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 DB - 从 19c 客户端连接 11gR2 DB - ORA-12650:没有通用加密或数据完整性算法