故障背景:项目正常运行好久,突然出现偶发性错误,无法获取数据库连接
处理过程:通过测试程序,排除业务逻辑问题,发现偶发性,时好时坏
测试程序报错内容:
java.sql.SQLRecoverableException: IO ERROR: The Network Adapter could not establish the connection
java.sql.SQLRecoverableException: IO 错误: The Network Adapter could not establish the connection
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:673)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:715)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:564)
at java.sql.DriverManager.getConnection(DriverManager.java:579)
at java.sql.DriverManager.getConnection(DriverManager.java:221)
at testd.TestDB.main(TestDB.java:14)
Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection
at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:445)
at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:464)
at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:594)
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:229)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1360)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486)
... 7 more
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:75)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)==========================================
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:157)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391)
at java.net.Socket.connect(Socket.java:579)
at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:162)
at oracle.net.nt.ConnOption.connect(ConnOption.java:133)
at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:411)
... 12 more
分析:使用排除法,分析错误原因
Connection conn = null;
try {
conn = DriverManager.getConnection("jdbc:oracle:thin:@xx.xx.xx.xx:1521:orcl", "xxxx","xxxx");
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
①:IP地址故意改错:Caused by: java.net.ConnectException: Connection timed out: connect 是这个错误,很慢,超时返回
②:端口号故意改错:Caused by: java.net.ConnectException: Connection refused: connect 拒绝服务,很快返回
③:实例名orcl故意改错:非此类错误
java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
....
④:用户名密码错误:java.sql.SQLException: ORA-01017: invalid username/password; logon denied 非此类错误
⑤:断网:Caused by: java.net.SocketException: Network is unreachable: connect ,很快返回
⑥:正常连接,压力测试,拒绝服务的错误提示。
java.sql.SQLRecoverableException: IO 错误: The Network Adapter could not establish the connection
...
Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection
...
Caused by: java.net.ConnectException: Connection refused: connect
...
Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found
at oracle.net.ns.NSProtocolStream.negotiateConnection(NSProtocolStream.java:272)
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:263)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1360)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486)
... 7 more
⑦:防火墙(注意,此处是win 自带防火墙,出站规则 1521 阻止)
java.sql.SQLRecoverableException: IO 错误: The Network Adapter could not establish the connection
...
Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection
...
Caused by: java.net.SocketException: Permission denied: connect
...
⑧:其他防火墙(火绒,防火墙 出站规则 1521 阻止)
java.sql.SQLRecoverableException: IO 错误: The Network Adapter could not establish the connection
...
Caused by: oracle.net.ns.NetException: The Network Adapter could not establish the connection
...
Caused by: java.net.ConnectException: Connection timed out: connect 注意此处报错原因和第一点相同。而且很慢,超时返回
--------------------------------------------------------------------------------------------------------------------------------------------------------
根据错误输出信息判断,两种情况出现这个问题:
0,IP错误了(不是这个,同样程序时好时坏)
1,网络故障,ip路由一直找不到,导致超时。
2,防火墙,而且是非系统防火墙(不然,很快就返回错误,不会提示超时)
真实原因,等解决了再补充吧