java程序 连接 oracle 数据库
问题描述
连接时日志报 Connection reset
在端口、用户名密码、地址都正确的情况下,java程序连接oracle数据库一直卡死,偶尔会连上几次,但是大部分情况下是连接失败!
java.sql.SQLRecoverableException: IO Error: Connection reset at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:467) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:546) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] at oracle.jdbc.driver.T4CConnection. (T4CConnection.java:236) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] ... 360 more Caused by: java.net.SocketException: Connection reset at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:115) ~[?:1.8.0_202] at java.net.SocketOutputStream.write(SocketOutputStream.java:155) ~[?:1.8.0_202] at oracle.net.ns.DataPacket.send(DataPacket.java:210) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:230) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:312) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] at oracle.net.ns.NetInputStream.read(NetInputStream.java:260) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] at oracle.net.ns.NetInputStream.read(NetInputStream.java:185) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] at oracle.net.ns.NetInputStream.read(NetInputStream.java:102) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] at oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:404) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:385) ~[ojdbc6-11.2.0.3.jar:11.2.0.3.0] ... 160 more }
原因分析:
经过oracle官网及网络上的查询情况主要分两种情况
- random 生成的随机值不够,大致就是连接oracle数据库时需要从随机熵池中取随机数,而这熵池就是 /dev/random这个文件产生的。而这个文件是阻塞产生熵值的,会导致连接阻塞。
- 未在 /etc/hosts文件中添加 本机主机名和IP的映射,且没有dns域名解析有可能会导致获取连接的时间太久。
解决方案:
1.在java应用启动时添加参数
-Djava.security.egd=file:/dev/./urandom
2.在 /etc/hosts文件中添加 本机主机名对应ip的映射
192.168.0.22 hostname



