記一次線上jdbc異常

週六 10 到 10點半 出現 423 個 jdbc 相關的錯
錯誤1
source_: -
tag:hostname: iZ8vb0dcfpyb8actu8rru6Z
tag:path: /data/logs/sjava/error.2020-11-21.log
tag:receive_time: 1605924967
topic: -
tracerId: 143d79bde0954b72b8b88cd6502c23b5
env: gray
offsetTimes: 502
durationTimes: 0
privateIp: -
serverIp: 10.65.199.235
timestamp: 1605924963825
full-message: j2-564d948cc8-bj9cl | gray | 10.68.4.129 | cn-zhangjiakou.10.65.199.235 | create connection SQLException, url: jdbc:mysql://pc-jiaoliuqu.rwlb.zhangbei.rds.aliyuncs.com:3306/jiaoliuqu?useUnicode=true&characterEncoding=utf-8, errorCode 0, state 08S01
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1117)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:350)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2408)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2445)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2230)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:813)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.GeneratedConstructorAccessor62.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:399)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:334)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:149)
at com.alibaba.druid.filter.FilterAdapter.connection_connect(FilterAdapter.java:786)
at com.alibaba.druid.filter.FilterEventAdapter.connection_connect(FilterEventAdapter.java:38)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:143)
at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:218)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:143)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1470)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1533)
at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2333)
java.net.UnknownHostException: pc-jiaoliuqu.rwlb.zhangbei.rds.aliyuncs.com
at java.net.InetAddress.getAllByName0(InetAddress.java:1281)
at java.net.InetAddress.getAllByName(InetAddress.java:1193)
at java.net.InetAddress.getAllByName(InetAddress.java:1127)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:249)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:300)
... 20 more

問題 描述 從上面調用棧上可以看出 jdbc 在初始化 JDBC4Connection的時候 出現了異常 ,異常的原因在 pc-jiaoliuqu.rwlb.zhangbei.rds.aliyuncs.com 無法識別
也就是說 jdbc:mysql://pc-jiaoliuqu.rwlb.zhangbei.rds.aliyuncs.com:3306/jiaoliuqu?useUnicode=true&characterEncoding=utf-8 中的dns 域名無法解析 。 無法解析的原因在java dns是有緩存策略的, 正向緩存和負向緩存 ,正向緩存 代表第一次dns 成功後 會緩存dns ,緩存解析失敗會到負向緩存 。如果失敗了會到負向緩存知道超時。


可能造成的原因
1.pc-jiaoliuqu.rwlb.zhangbei.rds.aliyuncs.com 對應ip 變過了 ,用的是緩存

  1. pc-jiaoliuqu.rwlb.zhanbei.rds.aliyuncs.com 解析超時 或者失敗 ,和dns 解析器有關,這點需要知道公司java 用的什麼dns 解析器 ,失敗後,用的負向緩存

解決方案

問題 可能很明確了 ,pc-jiaoliuqu.rwlb.zhangbei.rds.aliyuncs.com dns 無法解析 可能需要和運維同學溝通哈 ,是否有域名對應ip 改變過的情況 ,如果沒有,要看下域名爲什麼解析失敗 。
除此之外 我們要修改java緩存超時時間 。
這裏爲什麼要用dns 不用ip ,有點不明白 。
jvm啓動參數裏面配置-Dsun.net.inetaddr.ttl=0
修改配置文件$JDK_HOME/lib/security/java.security相應的參數networkaddress.cache.ttl=0
代碼裏直接設置:java.security.Security.setProperty(”networkaddress.cache.ttl” , “0”);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章