1

我们有 13 个应用程序服务器,其中一个应用程序服务器在启动 Tomcat 时得到

严重:无法创建池的初始连接。java.sql.SQLRecoverableException:IO 错误:连接超时。原因是:java.net.SocketException:连接超时。

我们没有收到其余服务器的错误。所以我们编写了一个java代码来测试jdbc,看看错误是由于db连接还是应用程序引起的。我们也得到了同样的java代码错误。

我们为检查连接所做的事情:

  1. Telnet 正在访问 Oracle 数据库服务器
  2. 网络团队分析了 tcpdump,应用程序和数据库服务器之间握手成功

Java 代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcDemo {
    public static void main(String[] args){
    try{

        Class.forName("oracle.jdbc.driver.OracleDriver");
        System.out.println("COnnection started");
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@"+"db_ip"+":"+"1521"+"/"+"db_name","db_user","password");
        System.out.println("COnnection Established");
        //Statement st=con.createStatement();
        System.out.println("connection name"+con);
        //ResultSet rs=st.executeQuery("");

    }
    catch(Exception e){

         e.printStackTrace();
    }
}

我们得到的错误:

root@app_server_ip # java -cp .:ojdbc7.jar JdbcDemo
COnnection started
java.sql.SQLRecoverableException: IO Error: Connection reset
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:841)
        at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:755)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:38)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:599)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:247)
        at JdbcDemo.main(JdbcDemo.java:13)
Caused by: java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:209)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at oracle.net.ns.Packet.receive(Packet.java:317)
        at oracle.net.ns.DataPacket.receive(DataPacket.java:101)
        at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:301)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:245)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:167)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:85)
        at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:119)
        at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:75)
        at oracle.jdbc.driver.T4CMAREngineStream.unmarshalUB1(T4CMAREngineStream.java:447)
        at oracle.jdbc.driver.T4C8TTIdty.receive(T4C8TTIdty.java:706)
        at oracle.jdbc.driver.T4C8TTIdty.doRPC(T4C8TTIdty.java:611)
        at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:2161)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:564)
        ... 6 more

应用服务器:Red Hat Enterprise Linux Server release 6.8
Oracle Db 版本:oracle 11g

4

1 回答 1

0

我们在 Oracle 11g 和 Red Hat Linux 机器上遇到了类似的问题。解决方案是添加这些 conf/run-time 参数。

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

Oracle JDBC 驱动程序需要一些随机数来维持安全标准。为此,它使用 java 来访问/dev/random. /dev/random由系统运行,需要硬件交互,如鼠标点击和其他键盘交互。您可以按原样添加参数(请注意,这/./urandom不是错字)。

于 2020-04-06T01:59:45.250 回答