开发者社区> 问答> 正文

10s 就Socket read timed out

version: 1.2.12 显式配置了读超时时间

--spring.datasource.connectionProperties=oracle.jdbc.ReadTimeout=600000

但是仍发现有10秒就Socket read timed out的情况

12:07 00:00:11.034 [ForkJoinPool.commonPool-worker-0] [ERROR] [c.alibaba.druid.pool.DruidDataSource] - {conn-10002} discard java.sql.SQLRecoverableException: IO Error: Socket read timed out at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:761) at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780) at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343) at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3887) at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1079) at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483) at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64) at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79) at com.baomidou.mybatisplus.core.executor.MybatisSimpleExecutor.doQuery(MybatisSimpleExecutor.java:67) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) 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:433) at com.sun.proxy.$Proxy57.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:158) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:76) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:62) at com.sun.proxy.$Proxy61.pagingGetUpdateStatuseList(Unknown Source) at com.caixin.people_companies.oracle2es.service.OrgOperAbndInfoRelaIncrementalSyncService.pagingGetChangedIdList(OrgOperAbndInfoRelaIncrementalSyncService.java:40) at com.caixin.people_companies.oracle2es.service.BaseIncrementalSyncService.putChangedId2QueueWithinRange(BaseIncrementalSyncService.java:226) at com.caixin.people_companies.oracle2es.service.BaseIncrementalSyncService.putChangedId2Queue(BaseIncrementalSyncService.java:192) at com.caixin.people_companies.oracle2es.service.BaseIncrementalSyncService.lambda$sync$0(BaseIncrementalSyncService.java:76) at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1626) at java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1618) at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056) at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692) at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) Caused by: java.net.SocketTimeoutException: Socket read timed out at oracle.net.nt.TimeoutSocketChannel.read(TimeoutSocketChannel.java:174) at oracle.net.ns.NIOHeader.readHeaderBuffer(NIOHeader.java:82) at oracle.net.ns.NIOPacket.readFromSocketChannel(NIOPacket.java:139) at oracle.net.ns.NIOPacket.readFromSocketChannel(NIOPacket.java:101) at oracle.net.ns.NIONSDataChannel.readDataFromSocketChannel(NIONSDataChannel.java:80) at oracle.jdbc.driver.T4CMAREngineNIO.prepareForReading(T4CMAREngineNIO.java:98) at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB1(T4CMAREngineNIO.java:534) at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:485) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252) at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612) at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226) at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59) at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:747) ... 37 common frames omitted

这个10s的超时是哪里设置的呢?

原提问者GitHub用户zhugw

展开
收起
山海行 2023-07-05 17:50:14 2660 0
4 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    据您提供的信息,您使用的是 Druid 数据库连接池的 1.2.12 版本,已经显式配置了读超时时间为 600 秒(即 10 分钟),但仍然遇到了 10 秒就 Socket read timed out 的问题。
    可能的原因如下:

    配置参数名称不正确:在 Oracle 数据库中,读超时参数的名称为 oracle.net.READ_TIMEOUT,而不是 oracle.jdbc.ReadTimeout。如果您使用了错误的参数名称,可能会导致参数无法生效。建议将参数名称修改为正确的名称,例如:
    Copy

    --spring.datasource.connectionProperties=oracle.net.READ_TIMEOUT=600000
    连接池配置优先级问题:在 Druid 数据库连接池中,某些连接参数的优先级可能会受到其他配置的影响。例如,如果连接池中设置了 maxWait 参数,可能会导致连接超时时间被忽略。建议检查连接池的其他配置,以确定这些参数的优先级。

    数据库驱动版本不支持参数:在某些数据库驱动版本中,可能不支持读超时参数。请确认您使用的是支持这些参数的数据库驱动版本。

    2023-07-30 21:10:16
    赞同 展开评论 打赏
  • 在您的配置中,您通过spring.datasource.connectionProperties设置了Oracle的读超时时间为600000毫秒(即10分钟)。这是正确的配置,但请注意,这个读超时时间是针对Oracle数据库连接的读操作,而不是针对整个查询或事务的执行时间。

    然而,根据异常信息,该超时错误可能并非由于读超时时间设置引起的。异常堆栈跟踪显示问题发生在Oracle JDBC驱动程序的T4CMAREngineNIO类中,而不是在Druid连接池中。

    这意味着可能存在其他问题导致的读取超时,例如:

    网络延迟:网络连接延迟可能导致读取超时。请确保网络连接稳定,并检查数据库服务器和应用程序服务器之间的网络延迟情况。

    数据库性能:数据库服务器的性能问题可能导致读取操作的响应时间增加。您可以评估数据库服务器的负载、查询优化和索引等方面,以提高数据库性能。

    查询复杂性:复杂的查询或大量数据的查询可能需要更长的时间来处理,导致超时。您可以优化查询语句、索引和表设计,以提高查询性能。

    2023-07-09 09:56:18
    赞同 展开评论 打赏
  • spring.datasource.druid.socket-timeout

    原回答者GitHub用户zhangdp

    2023-07-06 10:38:08
    赞同 1 展开评论 打赏
  • 根据提供的日志信息,超时时间设置可能位于以下位置之一:

    1. oracle.jdbc.ReadTimeout属性:您在应用程序配置中显式设置了读取超时时间为600000毫秒(即10分钟)。此配置决定了数据库读取操作的超时时间。

    2. 应用程序的其他配置文件或属性:除了Spring Boot的配置文件之外,还可能有其他配置文件或属性文件,其中可能包含与超时相关的设置。请检查这些文件以确认是否存在其他超时设置。

    3. 数据库服务器端配置:数据库服务器也可以对连接进行超时设置。请检查数据库服务器的配置,确保没有针对连接的较短超时值。

    需要注意的是,系统日志中显示了Socket read timed out错误,这表明超时发生在网络通信层面。如果以上步骤都无法解决问题,您可能需要检查网络连接、防火墙设置或其他网络配置,以确保网络通信正常并且没有任何干扰引起的超时情况。

    2023-07-05 19:17:42
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载