一、错误描述:这几天平台上线,支付系统要开始部署到生产环境。系统环境:linux centos 7.5 oracle11.2.0.4 java1.8。这套java系统总共有90个服务,每个服务有2个数据库连接,一起启动,分布在90台虚拟机中。发现有些机器连接数据的时候,卡住,等待一段时间,可能是1分钟,可能是2分钟,可能是10分钟,或者半个小时,然后日志打印出如下错误信息:
java.sql.SQLRecoverableException: IO Error: Connection reset at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:533) at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:557) at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:233) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:29) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:556) at java.sql.DriverManager.getConnection(DriverManager.java:579) at java.sql.DriverManager.getConnection(DriverManager.java:221) at test.jdbc.Main(Test.java:120) Caused by: java.net.SocketException: Connection reset at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) at java.net.SocketOutputStream.write(SocketOutputStream.java:153) at oracle.net.ns.DataPacket.send(DataPacket.java:248) at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:227) at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:309) at oracle.net.ns.NetInputStream.read(NetInputStream.java:257) at oracle.net.ns.NetInputStream.read(NetInputStream.java:182) at oracle.net.ns.NetInputStream.read(NetInputStream.java:99) at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:121) at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:77) at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1173) at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:309) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:200) at oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:404) at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:430) ... 35 more
查看oracle的日志,发现如下错误:
Fatal NI connect error 12170. VERSION INFORMATION: TNS for Linux: Version 11.2.0.4.0 - Production Oracle Bequeath NT Protocol Adapter for Linux: Version 11.2.0.4.0 - Production TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.4.0 - Production Time: 17-SEP-2018 13:54:01 Tracing not turned on. Tns error struct: ns main err code: 12535 TNS-12535: TNS:operation timed out ns secondary err code: 12606 nt main err code: 0 nt secondary err code: 0 nt OS err code: 0 Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=10.14.254.99)(PORT=51492)) WARNING: inbound connection timed out (ORA-3136)
偶尔还会有一两台机器发起大量的数据库空连接请求。我在oracle的连接登录日志dba_audit_trail有如下统计:
数据库登录报错:null password given; logon denied:
二、这2个问题最难是,很难追踪:问题时有时无,而且90个机器请求数据库,有些机器能迅速连接上,有些报超时。
到目前为止,搞清楚我说的问题了吗?目前有两个问题:1.java应用连接启动报超时,connection reset ,oracle 日志报 WARNING: inbound connection timed out (ORA-3136)。2 .发起大量数据库连接空请求问题 null password given; logon denied . 其实这2个问题发生最难追踪的是:错误现象时有时无。比如问题1,连接超时,启动5遍,可能第6遍连接就能立即连接上数据库。问题2,不是每次启动,都是大规模的发起空连接请求错误。而是有时候。
三、经过千辛万苦,终于解决了这2个问题,把解决方法贴出来:
问题1:java需要加参数-Djava.security.egd= file:/dev/../dev/urandom 另外请参考这篇文章:
https://blog.youkuaiyun.com/jackie_xiaonan/article/details/37740359 JDBC Connection Reset问题分析
问题2:Added -Doracle.jdbc.thinLogonCapability=o3
parameter to the java startup line.
java.sql.SQLException: ORA-01005: null password given; logon denied
四、以后碰到这种很多很难重现的错误,或者比较难追踪的问题,要在问题发生时候,尽可能重现错误。在解决这个问题时候会有很多干扰:
干扰1:90个服务一起启动,180个并发同时连接,数据库报超时。这个很容易让人想到是不是数据库的并发不够,导致连接不上。其实,这个时候,作为DBA,就应该在客户端机器,模拟90个服务,每个服务两个连接请求数据库连接,来验证是否是并发问题。
干扰2: 90个服务一起启动,有些机器能立即启动成功,有些报超时,让问题难以追踪。
干扰3:连接超时错误,可能第一次启动报连接超时,再连续启动3,4次,就又能连接数据库,变得很随机,难以追踪。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30393770/viewspace-2214317/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30393770/viewspace-2214317/