記錄一次connection reset 錯誤的解決全過程

前言

關於java.net.SocketException: Connection reset,是由於程序的某些異常導致套接字主動關閉,異常原因就太多,比如數據源出現故障,網絡故障等,所以這裡沒有標準的答案。

本地調試正常,部署多臺,就其中一臺失敗,提示connection reset 描述也比較模糊,造成錯誤的原因比較多,我先給出我這裡的解決方案,僅供嘗試,有效可以回來點個贊,無效但有其它解決可以回來評論一下供他人參考

我這裡最終的解決方案是在啟動jar時 添加 -Djava.security.egd=file:/dev/./urandom 如下

 java -jar -Xms2g -Mmx2g -Djava.security.egd=file:/dev/./urandom   /data/kuizii.jar

追其原因

tomcat在生成sessionId時底裡生成隨時數的算法選用瞭堵塞式 /dev/random算法,當連接

jvm隨機數算法選用不當導致tomcat的SessionID生成非常慢的情況,使用瞭-Djava.security.egd=file:/dev/./urandom就可以避免。

排查過程

背景

我的開發環境為springboot 2.1.5 +oracle 11g+ druid ,數據庫驅動是oracle.jdbc.OracleDriver.

這一次遇到 一個很偶現的問題,在部署jar包到某一臺linux時總會時不時提示以下錯誤,然爾在其它開發機以及其它linux服務器均正常。

錯誤提示如下:

2020-07-27 18:09:41.673  INFO 18397 — [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8086 (http)
2020-07-27 18:09:41.759  INFO 18397 — [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-07-27 18:09:41.759  INFO 18397 — [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.19]
2020-07-27 18:09:42.026  INFO 18397 — [           main] o.a.c.c.C.[.[localhost].[/scserver]      : Initializing Spring embedded WebApplicationContext
2020-07-27 18:09:42.026  INFO 18397 — [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 9074 ms
2020-07-27 18:09:43.811  INFO 18397 — [           main] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource
2020-07-27 18:11:16.805 ERROR 18397 — [           main] com.alibaba.druid.pool.DruidDataSource   : init datasource error, url: jdbc:oracle:thin:@192.168.1.42:1521:orcl

java.sql.SQLRecoverableException: IO 錯誤: Connection reset
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:498) ~[ojdbc6-11.2.0.4.0-atlassian-hosted.jar!/:11.2.0.4.0]
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:553) ~[ojdbc6-11.2.0.4.0-atlassian-hosted.jar!/:11.2.0.4.0]
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:254) ~[ojdbc6-11.2.0.4.0-atlassian-hosted.jar!/:11.2.0.4.0]
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) ~[ojdbc6-11.2.0.4.0-atlassian-hosted.jar!/:11.2.0.4.0]
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528) ~[ojdbc6-11.2.0.4.0-atlassian-hosted.jar!/:11.2.0.4.0]
    at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:156) ~[druid-1.1.23.jar!/:1.1.23]
    at com.alibaba.druid.filter.FilterAdapter.connection_connect(FilterAdapter.java:787) ~[druid-1.1.23.jar!/:1.1.23]
    at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:150) ~[druid-1.1.23.jar!/:1.1.23]
    at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:218) ~[druid-1.1.23.jar!/:1.1.23]
    at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:150) ~[druid-1.1.23.jar!/:1.1.23]
    at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1646) ~[druid-1.1.23.jar!/:1.1.23]
    at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1710) ~[druid-1.1.23.jar!/:1.1.23]
    at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:912) ~[druid-1.1.23.jar!/:1.1.23]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_252]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_252]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_252]

看到上面錯誤 ,肯定優先考慮到是數據庫連接的問題,於是做瞭以下嘗試

  • 1.查看連接字符串是否有效 (檢查沒問題,跳過)
  • 2.調整spring.datasource.driver 將目前的oracle.jdbc.OracleDriver 切換為過時的驅動oracle.jdbc.driver.OracleDriver
  • 3.從錯誤中可以看到是 oracle.jdbc.driver.OracleDriver這個驅動報錯,那麼嘗試再將spring.datasource.druid.driver-class-name設置為 oracle.jdbc.OracleDriver
  • 4.可能是druid的原因造成,去除druid依賴再嘗試,仍未解決

經過上述嘗試後,問題依舊。百度眾多,其中這篇文章得知以下方法可以解決,嘗試之後,果真可以。

在啟動jar時 添加 -Djava.security.egd=file:/dev/./urandom 如下

 java -jar -Xms2g -Mmx2g -Djava.security.egd=file:/dev/./urandom   /data/kuizii.jar

造成該錯誤的原因,比如數據源問題,啟動中其它錯誤也用導致提示這個錯誤,解決方案並非適用所有人。

總結

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: