記錄一次connection reset 錯誤的解決全過程
前言
關(guān)于java.net.SocketException: Connection reset,是由于程序的某些異常導(dǎo)致套接字主動關(guān)閉,異常原因就太多,比如數(shù)據(jù)源出現(xiàn)故障,網(wǎng)絡(luò)故障等,所以這里沒有標(biāo)準(zhǔn)的答案。
本地調(diào)試正常,部署多臺,就其中一臺失敗,提示connection reset 描述也比較模糊,造成錯誤的原因比較多,我先給出我這里的解決方案,僅供嘗試,有效可以回來點個贊,無效但有其它解決可以回來評論一下供他人參考
我這里最終的解決方案是在啟動jar時 添加 -Djava.security.egd=file:/dev/./urandom 如下
?java -jar -Xms2g -Mmx2g -Djava.security.egd=file:/dev/./urandom ? /data/kuizii.jar
追其原因
tomcat在生成sessionId時底里生成隨時數(shù)的算法選用了堵塞式 /dev/random算法,當(dāng)連接
jvm隨機數(shù)算法選用不當(dāng)導(dǎo)致tomcat的SessionID生成非常慢的情況,使用了-Djava.security.egd=file:/dev/./urandom就可以避免。
排查過程
背景
我的開發(fā)環(huán)境為springboot 2.1.5 +oracle 11g+ druid ,數(shù)據(jù)庫驅(qū)動是oracle.jdbc.OracleDriver.
這一次遇到 一個很偶現(xiàn)的問題,在部署jar包到某一臺linux時總會時不時提示以下錯誤,然爾在其它開發(fā)機以及其它linux服務(wù)器均正常。
錯誤提示如下:
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]
看到上面錯誤 ,肯定優(yōu)先考慮到是數(shù)據(jù)庫連接的問題,于是做了以下嘗試
- 1.查看連接字符串是否有效 (檢查沒問題,跳過)
- 2.調(diào)整spring.datasource.driver 將目前的oracle.jdbc.OracleDriver 切換為過時的驅(qū)動oracle.jdbc.driver.OracleDriver
- 3.從錯誤中可以看到是 oracle.jdbc.driver.OracleDriver這個驅(qū)動報錯,那么嘗試再將spring.datasource.druid.driver-class-name設(shè)置為 oracle.jdbc.OracleDriver
- 4.可能是druid的原因造成,去除druid依賴再嘗試,仍未解決
經(jīng)過上述嘗試后,問題依舊。百度眾多,其中這篇文章得知以下方法可以解決,嘗試之后,果真可以。
在啟動jar時 添加 -Djava.security.egd=file:/dev/./urandom 如下
?java -jar -Xms2g -Mmx2g -Djava.security.egd=file:/dev/./urandom ? /data/kuizii.jar
造成該錯誤的原因,比如數(shù)據(jù)源問題,啟動中其它錯誤也用導(dǎo)致提示這個錯誤,解決方案并非適用所有人。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決springcloud阿里云OSS文件訪問跨域問題的實現(xiàn)
本文主要介紹了解決springcloud阿里云OSS文件訪問跨域問題的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06System.getProperty(user.dir)定位問題解析
System.getProperty(user.dir) 獲取的是啟動項目的容器位置,用IDEA是項目的根目錄,部署在tomcat上是tomcat的啟動路徑,即tomcat/bin的位置,這篇文章主要介紹了System.getProperty(user.dir)定位問題,需要的朋友可以參考下2023-05-05SpringBoot快速設(shè)置攔截器并實現(xiàn)權(quán)限驗證的方法
本篇文章主要介紹了SpringBoot快速設(shè)置攔截器并實現(xiàn)權(quán)限驗證的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01解決Mybatis-Plus更新方法不更新NULL字段的問題
這篇文章主要介紹了解決Mybatis-Plus更新方法不更新NULL字段的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12在IntelliJ IDEA中創(chuàng)建和運行java/scala/spark程序的方法
這篇文章主要介紹了在IntelliJ IDEA中創(chuàng)建和運行java/scala/spark程序的教程,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05Java?swing實現(xiàn)應(yīng)用程序?qū)?shù)據(jù)庫的訪問問題
這篇文章主要介紹了Java?swing實現(xiàn)應(yīng)用程序?qū)?shù)據(jù)庫的訪問,本次實驗需要做一個GUI界面和一個連接查詢功能,在論壇上借鑒了其他大佬獲取網(wǎng)站內(nèi)容的部分代碼,然后自己做了一個及其簡陋的swing界面,算是把這個實驗完成了,需要的朋友可以參考下2022-09-09使用Sharding-JDBC對數(shù)據(jù)進行分片處理詳解
這篇文章主要介紹了使用Sharding-JDBC對數(shù)據(jù)進行分片處理詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10