🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
问题描述
Oracle在查询超过6秒的sql都会报Socket read timed out。我也根据网上的一些资料,在oracle url后拼接了oracle.net.CONNECT_TIMEOUT和oracle.jdbc.ReadTimeout。把超时时间放大到9分钟。但是还是无济于事。该超时还是超时,超时的sql我在navicat中执行是需要十几秒的。。
下面是我的具体配置和错误信息
1、oracel配置
spring:
datasource:
druid:
stat-view-servlet:
enabled: true
loginUsername: admin
loginPassword: 123456
dynamic:
druid:
idleConnectionTestPeriod: 60
max-idle: 50
initial-size: 5
min-idle: 50
maxActive: 100
maxWait: 900000
timeBetweenEvictionRunsMillis: 900000
minEvictableIdleTimeMillis: 900000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 50
filters: stat,slf4j
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
datasource:
# 主库数据源
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
username: user
password: 'password'
oracledb:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@101.10.10.10:1541/UAT?oracle.jdbc.ReadTimeout=900000&oracle.net.CONNECT_TIMEOUT=900000&oracle.jdbc.connection_timeout=900000
username: user
password: 'password'
2、异常信息
2024-06-27 15:07:04.681 INFO 4064 --- [ Tenant_Pool-1] oracle.jdbc : traceId=5366575D, anoEnabled=true.
2024-06-27 15:07:04.681 INFO 4064 --- [ Tenant_Pool-1] oracle.jdbc : Got Resend, SessionTraceId = 5366575D
2024-06-27 15:07:04.681 INFO 4064 --- [ Tenant_Pool-1] oracle.jdbc : Connection established. Cleared conn strategy stack
2024-06-27 15:07:04.681 INFO 4064 --- [ Tenant_Pool-1] oracle.jdbc : Sending break marker, SessionTraceId = 5366575D
2024-06-27 15:07:04.681 INFO 4064 --- [ Tenant_Pool-1] oracle.jdbc : returning void
2024-06-27 15:07:04.682 INFO 4064 --- [ Tenant_Pool-1] oracle.jdbc : null
java.sql.SQLRecoverableException: ORA-18730: IO 中断错误。: Socket read timed out
https://docs.oracle.com/error-help/db/ora-18730/
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:1120)
at oracle.jdbc.driver.OracleStatement.prepareDefineBufferAndExecute(OracleStatement.java:1286)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1211)
at oracle.jdbc.driver.OracleStatement.executeSQLSelect(OracleStatement.java:1579)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1429)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3930)
at oracle.jdbc.driver.OraclePreparedStatement.doExecute(OraclePreparedStatement.java:4162)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:4148)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1011)
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3446)
at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3444)
at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:434)
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3444)
at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:152)
at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483)
at sun.reflect.GeneratedMethodAccessor33.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59)
at com.sun.proxy.$Proxy143.execute(Unknown Source)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:64)
at com.sun.proxy.$Proxy141.query(Unknown Source)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:62)
at com.sun.proxy.$Proxy140.query(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:145)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427)
at com.sun.proxy.$Proxy138.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:166)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
at com.sun.proxy.$Proxy151.select(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)
at com.chsong.job.aop.DataSourceHandler.switchOracleDB(DataSourceHandler.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
at com.sun.proxy.$Proxy152.select(Unknown Source)
at com.chsong.job.service.impl.MesDsServiceImpl.lambda$erpToMes$0(MesDsServiceImpl.java:55)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: oracle.net.nt.TimeoutInterruptHandler$IOReadTimeoutException: Socket read timed out
at oracle.net.nt.TimeoutSocketChannel.newTimeoutException(TimeoutSocketChannel.java:1006)
at oracle.net.nt.TimeoutSocketChannel.doBlockedRead(TimeoutSocketChannel.java:607)
at oracle.net.nt.TimeoutSocketChannel.read(TimeoutSocketChannel.java:536)
at oracle.net.ns.NSProtocolNIO.doSocketRead(NSProtocolNIO.java:1224)
at oracle.net.ns.NIOPacket.readHeader(NIOPacket.java:272)
at oracle.net.ns.NIOPacket.readPacketFromSocketChannel(NIOPacket.java:205)
at oracle.net.ns.NIOPacket.readFromSocketChannel(NIOPacket.java:148)
at oracle.net.ns.NIOPacket.readFromSocketChannel(NIOPacket.java:121)
at oracle.net.ns.NIONSDataChannel.readDataFromSocketChannel(NIONSDataChannel.java:111)
at oracle.jdbc.driver.T4CMAREngineNIO.prepareForUnmarshall(T4CMAREngineNIO.java:930)
at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB1(T4CMAREngineNIO.java:464)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:946)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:409)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:483)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:261)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:1106)
... 75 common frames omitted
Caused by: java.net.SocketTimeoutException: null
at sun.nio.ch.SocketAdaptor$SocketInputStream.read(SocketAdaptor.java:211)
at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103)
at oracle.net.nt.TimeoutSocketChannel.doBlockedRead(TimeoutSocketChannel.java:600)
... 89 common frames omitted
如上问题有来自我自身项目开发,有的收集网站,有的来自读者,如有侵权,立马删除。
解决方案
如下是上述问题的解决方案,仅供参考:
ORA-18730: IO 中断错误:Socket read timed out
是一个Oracle数据库的网络通信错误,表明客户端与数据库服务器之间的网络连接在尝试读取数据时超时。你已经尝试通过在连接字符串中设置 oracle.jdbc.ReadTimeout
和 oracle.net.CONNECT_TIMEOUT
来增加超时时间,但是问题依然存在。
以下是一些可能的解决步骤:
-
检查网络问题:首先确保数据库服务器的网络连接是稳定的。使用工具如
ping
或traceroute
检查网络延迟和丢包情况。 -
调整超时设置:尽管你已经设置了连接超时,但是可能需要检查其他相关的超时设置,比如
SQLNET.EXPIRE_TIME
和SQLNET.INBOUND_CONNECT_TIMEOUT
。 -
检查数据库配置:在数据库服务器端,检查是否有任何配置可能导致连接超时,如
SQLNET.WAIT_TIME
。 -
检查应用程序逻辑:确保应用程序在执行长时间运行的查询时,没有其他操作(如额外的数据库调用)可能会影响连接。
-
使用连接池:你已经在配置中使用了Druid连接池,确保连接池的配置是正确的,并且没有因为连接池自身的超时设置导致连接提前关闭。
-
检查数据库负载:如果数据库服务器负载很高,可能需要优化查询或增加服务器资源。
-
检查防火墙设置:确保没有任何网络防火墙或安全组设置会中断长时间运行的数据库连接。
-
Oracle客户端配置:检查Oracle客户端的配置文件
sqlnet.ora
和tnsnames.ora
是否有其他影响连接的设置。 -
查看Oracle文档:Oracle官方文档提供了关于
ORA-18730
错误的详细信息和可能的解决方案。 -
联系数据库管理员:如果你不是数据库管理员,应该联系他们以获取帮助,因为可能需要从服务器端进行调整。
-
错误处理:在应用程序中实现适当的错误处理逻辑,以便在发生
Socket read timed out
错误时进行重试或其他恢复操作。
请注意,即使设置了客户端的超时参数,如果服务器端的超时设置更短,或者由于网络问题导致数据包传输延迟,客户端的设置也可能不会生效。因此,需要从多个角度来诊断和解决问题。
希望如上措施及解决方案能够帮到有需要的你。
PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。
若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。
☀️写在最后
ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。
码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。
同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!
📣关于我
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。