【问题标题】:Java OracleDB connection taking too long the first timeJava OracleDB 连接第一次耗时太长
【发布时间】:2013-01-02 06:17:22
【问题描述】:

我在连接到 Oracle 数据库时遇到问题,它需要很长时间(大约 5 分钟)并且它会发送如下所示的异常。大多数情况下,在第一个错误之后,同一进程的下一个连接正常工作。

这是一台 RHEL 6 机器,有两个不同的网络接口和 IP 地址。

注意: 我没有使用像这样的 url:“jdbc:oracle:thin:@xxxx:yyy,它实际上是:”jdbc:oracle:thin:@xxxx:yyyy:zzz. SID 没有丢失,抱歉:(

这大致是我分离出来的:

bin/java -classpath ojdbc6_g.jar -Djavax.net.debug=all -Djava.util.logging.config.file=logging.properties

Class.forName ("oracle.jdbc.OracleDriver")
DriverManager.getConnection("jdbc:oracle:thin:@xxxx:yyyy", "aaaa", "bbbb")

错误堆栈跟踪:

java.sql.SQLRecoverableException: IO Error: Connection reset
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:533)
        at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:557)
        at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:233)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:29)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:556)
        at java.sql.DriverManager.getConnection(DriverManager.java:579)
        at java.sql.DriverManager.getConnection(DriverManager.java:221)
        at test.jdbc.Main(Test.java:120)
Caused by: java.net.SocketException: Connection reset
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
        at oracle.net.ns.DataPacket.send(DataPacket.java:248)
        at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:227)
        at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:309)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:257)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:182)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:99)
        at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:121)
        at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:77)
        at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1173)
        at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:309)
        at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:200)
        at oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:404)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:430)
        ... 35 more

这里有一个非常详细的日志:http://pastebin.com/MMFKU26z GET STUCK HERE 代表 5 分钟的等待时间

【问题讨论】:

  • 我猜这与两个网络接口有关。它是否有可能路由到错误的,超时然后使用正确的?
  • 我也是这么认为的,有什么办法可以查到吗?

标签: java oracle11g redhat


【解决方案1】:

您可能遇到了 Oracle JDBC 驱动程序的问题,该驱动程序在 Linux 上默认使用阻塞随机数生成器。尝试使用以下参数运行 Java:

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

或者,您可以启动一个守护程序来为随机数生成器提供数据。 Linux“rngd”守护进程就是一个例子。

来源:

【讨论】:

  • 我希望我能给这个更多的选票。这解决了一切问题,因为我在监控系统上与 oracle 的连接速度很慢...在 Ubuntu 14.04.3 LTS 上运行。
【解决方案2】:

查看您的连接字符串,似乎缺少 Oracle 服务名称或 SID。连接字符串应类似于"jdbc:oracle:thin:@xxxx:yyyy/zzz",其中zzz 是SID。您可能还想看看this question 的答案。

【讨论】:

  • 请仔细阅读问题:大多数时候,在第一个错误之后,同一进程的下一个连接正常工作。
  • @Andremoniy 您引用的问题部分可能是 TNS 侦听器行为的结果。所以从 TNS 监听器的角度来看,它可以是这样的:一些客户端建立了一个连接,但没有说明它想使用什么特定的服务。侦听器等待一段时间,最后重置连接。无论如何,示例代码中连接字符串的格式不正确 - 这就是我解决它的原因。
  • 对不起!!!我的错,当我隐藏参数时,我忘记了 SID,但它的实际形式是:“jdbc:oracle:thin:@xxxx:yyyy:zzz”
猜你喜欢
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 2014-03-01
  • 1970-01-01
相关资源
最近更新 更多