使用druid数据源,由于网络问题导致oracle SocketInputStream.socketRead0堵塞解决办法
2018-03-20 11:04
1651 查看
线上Oracle数据库网络非常不稳定,不时发生连接闪断,发现一个线程一直堵塞,日志没有错误。dump出线程信息后如下:
pool-4-thread-50" prio=10 tid=0x00007f92f5251000 nid=0x26e1 runnable [0x00007f929a1df000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at oracle.net.ns.Packet.receive(Packet.java:282)
at oracle.net.ns.DataPacket.receive(DataPacket.java:103)
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:230)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:175)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:100)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:85)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:122)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:78)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1179)
at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1155)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:279)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:194)
at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:853)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1145)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1259)
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1469)
- locked <0x000000074abc5ae8> (a oracle.jdbc.driver.T4CConnection)
at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:389)
at com.alibaba.druid.pool.vendor.OracleValidConnectionChecker.isValidConnection(OracleValidConnectionChecker.java:84)
at com.alibaba.druid.pool.DruidAbstractDataSource.testConnectionInternal(DruidAbstractDataSource.java:1358)
at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1260)
由于网络不稳定,每次拿连接的时候先测试连接的可用性,但是发生了socket 读堵塞。阻塞了线程的运行。是查询超时没有设置,我立即查看DruidDataSource配置是否有查询超时配置。发现如下三个配置
重新添加配置后重启,继续观察。隔几天再次发现还是堵塞。判断这些查询超时的配置不能设置到Socket的读超时设置中。查看资料发现需要配置如下属性
参考资料:https://www.jianshu.com/p/6d19e0d7f81c
https://www.cubrid.org/blog/understanding-jdbc-internals-and-timeout-configuration
资料里面有详细的解读。
pool-4-thread-50" prio=10 tid=0x00007f92f5251000 nid=0x26e1 runnable [0x00007f929a1df000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at oracle.net.ns.Packet.receive(Packet.java:282)
at oracle.net.ns.DataPacket.receive(DataPacket.java:103)
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:230)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:175)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:100)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:85)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:122)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:78)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1179)
at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1155)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:279)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:194)
at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:853)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1145)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1259)
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1469)
- locked <0x000000074abc5ae8> (a oracle.jdbc.driver.T4CConnection)
at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:389)
at com.alibaba.druid.pool.vendor.OracleValidConnectionChecker.isValidConnection(OracleValidConnectionChecker.java:84)
at com.alibaba.druid.pool.DruidAbstractDataSource.testConnectionInternal(DruidAbstractDataSource.java:1358)
at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1260)
由于网络不稳定,每次拿连接的时候先测试连接的可用性,但是发生了socket 读堵塞。阻塞了线程的运行。是查询超时没有设置,我立即查看DruidDataSource配置是否有查询超时配置。发现如下三个配置
datasource.setValidationQueryTimeout(queryTimeout); datasource.setQueryTimeout(queryTimeout); datasource.setTransactionQueryTimeout(queryTimeout);
重新添加配置后重启,继续观察。隔几天再次发现还是堵塞。判断这些查询超时的配置不能设置到Socket的读超时设置中。查看资料发现需要配置如下属性
datasource.connectionProperties=oracle.jdbc.ReadTimeout=10000;oracle.net.CONNECT_TIMEOUT=10000
参考资料:https://www.jianshu.com/p/6d19e0d7f81c
https://www.cubrid.org/blog/understanding-jdbc-internals-and-timeout-configuration
资料里面有详细的解读。
相关文章推荐
- RabbitMQ使用不当导致的队列堵塞问题及解决办法
- 操作系统启动不了和网络连接无法使用的故障问题解决办法
- 关于“打开项目**时发生问题,尝试退出并重新启动应用程序。如果问题仍然存在,则可能是由于正在使用不支持的项目版本,或者项目文件可能损坏”的问题的解决办法。
- Ubuntu由于修改etc/profile文件导致开机无法登陆问题解决办法(仅供参考)
- 【转】注册表问题导致usb设备或光驱无法使用的解决办法
- 修改Linux内核导致网络无法使用问题解决
- 由于使用 xfire/HttpMethod 造成Socket连接池满的问题及解决办法
- ENVI\IDL shp转换evf 由于shp中polygon的岛导致的问题的解决办法
- 由于Spring3.0.5、Hibernante3.2.7、Struts2.1版本不兼容导致的问题及其解决办法。
- windows 2008初体验常见问题: 无线网络"没有正确配置为使用IP协议" 错误解决办法
- Kettle中使用SqlServer数据源被拒绝问题解决办法
- 技术贴】QQ空间打开缓慢,无法编辑日志,由于您当前网络不稳定导致QQ空间打开异常的解决办法。
- 在Mybatis-spring中由于默认Autowired导致不能配置多个数据源的问题分析及解决
- odbcasvc.exe导致CPU使用100%问题的解决办法
- 使用网络目录映射虚拟目录出现 500.19 权限不足问题的一个解决办法
- 由于使用zen coding导致myeclipse6.5中使用Alt+/不自动提示的解决办法
- 使用ODBC创建数据源出现未发现 ”Oracle(TM) 客户端和网络组件“问题解决方案
- 由于IE版本问题导致SAP的F1帮助文档显示不出来的解决办法
- 由于Android版本问题StrictMode模式下访问网络报错的解决办法 绝对经典
- 由于使用 xfire/HttpMethod 造成Socket连接池满的问题及解决办法