java - 使用 JDBC 连接到数据库服务器的简单 Java 程序的执行时间随处变化

标签 java oracle jdbc

我的应用程序服务器上有一个非常简单的 java 程序(J.java,见下文),它使用 Oracle 的 JDBC 瘦驱动程序成功连接到数据库服务器(两台服务器都是 Linux CentOS)上的 Oracle 11.2 数据库。

从下面 Java 代码中的 setURL 命令可以看出,我已将应用程序和数据库服务器配置为彼此相邻,并且它们在同一网络上(交叉电缆相互连接) ,所以除了我的代码之外,这些(开发)盒子上没有网络流量。

问题是执行时间变化很大。如果我运行它 5 次,它(看似随机)可能需要 0.01 秒、10 秒、50 秒或超过一分钟的时间来执行。如果超过一分钟(大约),程序不会完成,而是返回下面显示的错误。

知道这里会发生什么吗?

--------error returned when execution take more than about 1 minute-------
gn@host7 [~/fd]# java -cp ./ojdbc6_g.jar:. J
Exception in thread "main" java.sql.SQLRecoverableException: IO Error: Connection reset
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:494)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:547)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:225)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:29)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:556)
at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:454)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:328)
at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:233)
at J.main(J.java: line 16)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:96)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at oracle.net.ns.DataPacket.send(DataPacket.java:219)
at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:208)
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:224)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:172)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:97)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:82)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:120)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:76)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1158)
at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1134)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:307)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:199)
at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:365)
at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:812)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:411)
... 8 more

J.java 的 java 代码是:

import java.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;

class J {

    public static void main(String args[]) throws SQLException {
    Connection conn;
    // connect to database
    OracleDataSource ds = new OracleDataSource();
    ds.setURL("jdbc:oracle:thin:hr/hrpwd@192.168.0.1:1973:mySID");
    conn = ds.getConnection();

    // create Oracle DatabaseMetaData object
    DatabaseMetaData meta = conn.getMetaData();
    // show database version
    System.out.println("Database version is " + meta.getDriverVersion());

    if ( conn != null ) {
      try { conn.close(); } catch ( Exception ex ) {}
      conn = null;
    }
    } 
}

更新 1:

这看起来像是潜在的罪魁祸首:

http://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/

任何人都知道如何实际实现那里提供的解决方案(请参阅最后的第 3 项——我在哪里可以找到要更改的 -Djava.security.egd=file:///dev/urandom吗?)

最佳答案

答案如下(来自CentOS论坛):

Try editing /etc/sysconfig/rngd to contain:

# Add extra options here
EXTRAOPTIONS="-r /dev/urandom"

Then "service rngd start". If that works, then "chkconfig rngd on" will start it at boot.

另见:

http://www.linuxfromscratch.org/hints/downloads/files/entropy.txt

http://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/

https://www.centos.org/modules/newbb/viewtopic.php?topic_id=36209&start=0#forumpost156856

https://forums.oracle.com/forums/thread.jspa?messageID=3793101

关于java - 使用 JDBC 连接到数据库服务器的简单 Java 程序的执行时间随处变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9573169/

相关文章:

java - 使用 SMBJ 写入文件时遇到问题

java - 查找此递归函数的时间复杂度

Java:我创建了一个包含名称和频率的单词对象列表,但无法更新频率

sql - 如何在 pl/sql 函数中将多行存储在一个变量中?

java - SQLiteJDBC 给 org.sqlite.MetaData.getImportedKeys not yet implemented error with Hibernate

java - 带有 MariaDB 驱动程序的 MySQL 服务器产生日期排序错误

java - Spring beans 的键为 Map<String,Foo>

java - 如何处理jdbc事务中的父键约束?

sql - 为什么确定性函数在 SQL 中执行额外的时间?

Java SwingWorker 与 JDialog 在 JDBC 网络操作期间显示 JProgressBar