複雜網絡環境下應用與數據庫連接報錯問題處理ErrorCode17410(No more data to read from socket)

一、問題表象

1.日誌顯示數據庫連接錯誤(errorCode 17410, state 08000)

2.程序執行異常:數據庫初始化失敗(init datasource error, url: jdbc:oracle:thin:@IP:1521:orcl java.sql.SQLRecoverableException: No more data to read from socket)

詳細日誌如下:

2020-05-20 12:51:02
[ERROR]-[Thread: localhost-startStop-1]-[com.alibaba.druid.pool.DruidDataSource.init()]: init datasource error, url: jdbc:oracle:thin:@IP:1521:orcl
java.sql.SQLRecoverableException: No more data to read from socket
        at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1157)
        at oracle.jdbc.driver.T4C8TTIdty.receive(T4C8TTIdty.java:669)
        at oracle.jdbc.driver.T4C8TTIdty.doRPC(T4C8TTIdty.java:576)
        at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1166)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:320)
        at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546)
        at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
        at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1461)
        at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1525)
        at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:734)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1060)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1056)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:104)
        at com.jfinal.plugin.activerecord.TableBuilder.build(TableBuilder.java:43)
        at com.jfinal.plugin.activerecord.ActiveRecordPlugin.start(ActiveRecordPlugin.java:226)
        at com.jfinal.core.Config.startPlugins(Config.java:128)
        at com.jfinal.core.Config.configPluginWithOrder(Config.java:71)
        at com.jfinal.core.Config.configJFinal(Config.java:56)
        at com.jfinal.core.JFinal.init(JFinal.java:63)
        at com.jfinal.core.JFinalFilter.init(JFinalFilter.java:49)
        at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279)
        at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:260)
        at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105)
        at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4958)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5652)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
        at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1260)
        at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:2002)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

2020-05-20 12:51:02
[ERROR]-[Thread: localhost-startStop-1]-[com.alibaba.druid.pool.DruidDataSource.init()]: {dataSource-2} init error
java.sql.SQLRecoverableException: No more data to read from socket
        at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1157)
        at oracle.jdbc.driver.T4C8TTIdty.receive(T4C8TTIdty.java:669)
        at oracle.jdbc.driver.T4C8TTIdty.doRPC(T4C8TTIdty.java:576)
        at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1166)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:320)
        at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546)
        at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
        at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1461)
        at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1525)
        at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:734)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1060)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1056)
        at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:104)
        at com.jfinal.plugin.activerecord.TableBuilder.build(TableBuilder.java:43)
        at com.jfinal.plugin.activerecord.ActiveRecordPlugin.start(ActiveRecordPlugin.java:226)
        at com.jfinal.core.Config.startPlugins(Config.java:128)
        at com.jfinal.core.Config.configPluginWithOrder(Config.java:71)
        at com.jfinal.core.Config.configJFinal(Config.java:56)
        at com.jfinal.core.JFinal.init(JFinal.java:63)
        at com.jfinal.core.JFinalFilter.init(JFinalFilter.java:49)
        at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279)
        at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:260)
        at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105)
        at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4958)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5652)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
        at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1260)
        at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:2002)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

二、網絡環境分析

三、排查誤區

1.只要做過網閘映射,不管目標地址是否可用,網閘測試ip和端口都是通的;(容易引導誤以爲目標地址可用)

2.要儘量保持測試環境與正式環境高度一致,避免引發其他懷疑,誤導問題排查;

四、最終結果

就是因爲MTU導致數據包被切片,無法正常返回結果(連接異常,無法獲取數據)。

MTU:通信術語 
最大傳輸單元(Maximum Transmission Unit)是指一種通信協議的某一層上面所能通過的最大數據包大小(以字節爲單位)。 
我們在使用互聯網時進行的各種網絡操作,都是通過一個又一個“數據包”傳輸來實現的。而MTU指定了網絡中可傳輸數據包的最大尺寸,在我們常用的以太網中,MTU是1500字節。超過此大小的數據包就會將多餘的部分拆分再單獨傳輸 。
MTU的設置不是一個值天下通用,所以需要我們合理設置特殊場景的MTU 。

MTU更多信息請參考如下博客:

https://blog.csdn.net/jctian000/article/details/87858470

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