'How to resolve java.sql.SQLRecoverableException: IO Error: Connection timed out
We have 13 application servers out of which for one application server when we are starting tomcat we are getting the
SEVERE: Unable to create initial connections of pool. java.sql.SQLRecoverableException: IO Error: Connection timed out.caused by Caused by: java.net.SocketException: Connection timed out.
we are not getting the error for the rest of the servers. so we wrote a java code to test the jdbc to find out whether the error is due to db connectivity or application. and we are getting the same error for the java code also.
Things we did to check connectivity:
- Telnet is working to the Oracle database server
- Network team analysed the tcpdump and there is a successfull handshake between the app and database server
Java Code:
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();
}
}
Error we are getting:
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
App server: Red Hat Enterprise Linux Server release 6.8
Oracle Db version: oracle 11g
Solution 1:[1]
We faced a similar issue, on Oracle 11g and Red Hat Linux boxes. The solution was to add these conf/run-time parameters.
-Djava.security.egd=file:/dev/./urandom
-Dsecurerandom.source=file:/dev/./urandom
The Oracle JDBC driver needs some random numbers to maintain a standard of security. For this it uses java to access /dev/random. /dev/random is run by the system and requires hardware interactions like mouse clicks and other keyboard interactions. You may add the parameter as is (note that /./urandom is not a typo).
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | GopherGopher |
