关于使用druid数据源连接Oracle导致的SQLRecoverableException(socket read timeout,关闭的连接等)-程序员宅基地

技术标签: 数据库  

背景

数据源初始化后,获取Oracle的连接进行查询操作,相隔 半个小时 左右,再次对同一数据库进行查询操作。

问题

第二次查询的时候,就会出现如下一些异常情况

2019-06-05 14:17:58.247 [CorePoolHandler-thread-6] ERROR [LOGID:] com.alibaba.druid.pool.DruidDataSource - discard connection
java.sql.SQLRecoverableException: IO 错误: Socket read timed out
	at oracle.jdbc.driver.T4CPreparedStatement.fetch(T4CPreparedStatement.java:1031) ~[ojdbc6-12.1.0.1-atlassian-hosted.jar:12.1.0.1.0]
	at oracle.jdbc.driver.OracleStatement.fetchMoreRows(OracleStatement.java:3590) ~[ojdbc6-12.1.0.1-atlassian-hosted.jar:12.1.0.1.0]
	at oracle.jdbc.driver.InsensitiveScrollableResultSet.fetchMoreRows(InsensitiveScrollableResultSet.java:937) ~[ojdbc6-12.1.0.1-atlassian-hosted.jar:12.1.0.1.0]
	at oracle.jdbc.driver.InsensitiveScrollableResultSet.absoluteInternal(InsensitiveScrollableResultSet.java:901) ~[ojdbc6-12.1.0.1-atlassian-hosted.jar:12.1.0.1.0]
	at oracle.jdbc.driver.InsensitiveScrollableResultSet.next(InsensitiveScrollableResultSet.java:572) ~[ojdbc6-12.1.0.1-atlassian-hosted.jar:12.1.0.1.0]
	at com.alibaba.druid.filter.FilterChainImpl.resultSet_next(FilterChainImpl.java:917) ~[druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.filter.FilterAdapter.resultSet_next(FilterAdapter.java:1907) ~[druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.filter.FilterChainImpl.resultSet_next(FilterChainImpl.java:913) ~[druid-1.1.10.jar:1.1.10]
2019-06-05 14:22:32.714 [Druid-ConnectionPool-Destroy-1030806200] ERROR [LOGID:] com.alibaba.druid.util.JdbcUtils - close connection error
java.sql.SQLRecoverableException: IO 错误: Socket read timed out
	at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:770) ~[ojdbc6-12.1.0.1-atlassian-hosted.jar:12.1.0.1.0]
	at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:4581) ~[ojdbc6-12.1.0.1-atlassian-hosted.jar:12.1.0.1.0]
	at com.alibaba.druid.filter.FilterChainImpl.connection_close(FilterChainImpl.java:186) ~[druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.filter.stat.StatFilter.connection_close(StatFilter.java:261) ~[druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.filter.FilterChainImpl.connection_close(FilterChainImpl.java:181) ~[druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.close(ConnectionProxyImpl.java:115) ~[druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.util.JdbcUtils.close(JdbcUtils.java:73) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.DruidDataSource.shrink(DruidDataSource.java:2797) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.DruidDataSource$DestroyTask.run(DruidDataSource.java:2562) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.DruidDataSource$DestroyConnectionThread.run(DruidDataSource.java:2549) [druid-1.1.10.jar:1.1.10]
2019-06-17 18:11:18.995 [task-scheduler-5] ERROR [LOGID:] com.alibaba.druid.util.JdbcUtils - close statement error
java.sql.SQLRecoverableException: 关闭的连接
	at oracle.jdbc.driver.PhysicalConnection.needLine(PhysicalConnection.java:6291) ~[ojdbc6-12.1.0.1-atlassian-hosted.jar:12.1.0.1.0]
	at oracle.jdbc.driver.OracleStatement.closeOrCache(OracleStatement.java:1364) ~[ojdbc6-12.1.0.1-atlassian-hosted.jar:12.1.0.1.0]
	at oracle.jdbc.driver.OracleStatement.close(OracleStatement.java:1343) ~[ojdbc6-12.1.0.1-atlassian-hosted.jar:12.1.0.1.0]
	at oracle.jdbc.driver.OracleStatementWrapper.close(OracleStatementWrapper.java:100) ~[ojdbc6-12.1.0.1-atlassian-hosted.jar:12.1.0.1.0]
	at com.alibaba.druid.util.JdbcUtils.close(JdbcUtils.java:84) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.vendor.OracleValidConnectionChecker.isValidConnection(OracleValidConnectionChecker.java:88) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.DruidAbstractDataSource.testConnectionInternal(DruidAbstractDataSource.java:1400) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1299) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5007) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:680) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5003) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1233) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1225) [druid-1.1.10.jar:1.1.10]
	at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:90) [druid-1.1.10.jar:1.1.10]
	at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) [spring-jdbc-4.3.14.RELEASE.jar:4.3.14.RELEASE]

排查原因过程

一开始以为是查询的数据量太大(7.9W+),于是网上查了druid对Oracle数据库的读超时时间相关的设置,配置如下,设置后发现仍旧是socket read timeout,继续增大socket read timeout的值,虽然“socket read timeout”没有出现了,但是“关闭的连接”字样冒了出来。

spring.datasource.traffic.connectionProperties=oracle.net.CONNECT_TIMEOUT=6000;oracle.jdbc.ReadTimeout=180000

查看出错日志,跟踪方法栈,发现是获取连接时执行了testConnectionInternal()方法,继续跟踪方法栈发现是执行数据源配置中的validationQuery语句时,抛出了异常。但这个是测试连接是否可用的方法,不会影响下一步对数据库的操作,因为druid数据源会创建新的一条数据库连接。
但是!打印异常的logger明明是debug,这XX为什么要以error的形式写进日志里!!!如果没有仔细看上下文的代码,能把人纠结个好几天!!!

    public static void close(Statement x) {
        if (x == null) {
            return;
        }
        try {
            x.close();
        } catch (Exception e) {
            LOG.debug("close statement error", e);
        }
    }

总结

查看出错日志检查问题的时候,不能只看抛出错误最近的那几行代码,一定要看过整体的方法栈,知道运行的流程,再仔细看抛出异常的代码,看看该行代码执行的前后逻辑。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013347796/article/details/92798928

智能推荐

6-4 查找子串_6-4 查找子串 本题要求实现一个字符串查找的简单函数。 函数接口定义: char *sear-程序员宅基地

文章浏览阅读1.9k次。本题要求实现一个字符串查找的简单函数。函数接口定义:char *search( char *s, char *t );函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。裁判测试程序样例:#include <stdio.h>#define MAXS 30char *search(char *s, char *t);..._6-4 查找子串 本题要求实现一个字符串查找的简单函数。 函数接口定义: char *sear

C# openldap登录验证并获取多属性-程序员宅基地

文章浏览阅读812次。1. 设计界面输入需要验证的账号密码<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="login.aspx.cs" Inherits="ldap.login" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu

Linux HID分析-程序员宅基地

文章浏览阅读1.1w次,点赞2次,收藏20次。Linux hid子系统实现原理以及访问方式

如何去掉、修改品牌机的开机画面 _联想电脑 logo 定制企业 删除-程序员宅基地

文章浏览阅读1.6w次,点赞4次,收藏9次。 使用品牌机的朋友们应该都会了解一个情况,在开机的时候会有一个开机画面,小烟我买的是联想6610的电脑,用了很多年了,终于忍受不了那“联想电脑”几个字决心将其除掉!别嫌小烟我啰嗦,我也不是什么高手,只知道开机出现的画面应该是写在BIOS里的,具体什么地方都没有什么概念,上网查了半天知道下面一些内容:1.开机画面存储在BIOS中2.BIOS文件的后缀名为.bin3.想要对BIOS文件进行读写需要_联想电脑 logo 定制企业 删除

为什么那些Python程序员这么厉害?-程序员宅基地

文章浏览阅读234次。如果你想问最近这些年什么编程语言最值得学习,我相信很多人都会告诉你是Python!所以不仅是开发小白,甚至很多开发老手,也都开始学习Python,作为辅助第二语言来提高自己的职场竞争力。不..._程序员为什么这么厉害

深入浅出级联删除_级联删除有什么用-程序员宅基地

文章浏览阅读9.6k次。首先,我们看一张具有主外键关系的表:1,如果我们想要删除Recharge表中Id为5的数据,用SQL语句:deleteRecharge where Id='5'执行结果为:2行收影响----成功删除了Recharge表中Id为5的两条记录!2.要删除Card表中的CardId为4的数据,用SQL语句试试:delete Card whereCardId ='4_级联删除有什么用

随便推点

elasticsearch ik_smart 中文分词器,分词英文的时候有个小 bug_ik分词器英文分词-程序员宅基地

文章浏览阅读2.5k次。昨天在测试 match 查询用法的时候,随便输入了一段twenty British women made history这样一段文本,结果却查不出来记录。明显是有问题的,这段文本是从 es 记录中拷贝的一句,怎么就查不出来了呢?后来看了下分词器用的是 ik_smart ,是不是中文分词器对英文支持的不够好?后来试了下 standard 分词器,是可以查出来的。刚才试了下分词结果,发现了问题所在:GET /_analyze{ "analyzer": "ik_smart", "text":_ik分词器英文分词

Mask_RCNN:使用COCO权重进行特定类别预测(只标记出你需要的类别)_maskrcnn预训练权重-程序员宅基地

文章浏览阅读1.6w次,点赞2次,收藏31次。采用自己的模型进行预测,或者直接使用COCO权重进行全部类别的预测看这里: Mask_RCNN:使用自己训练好的模型进行预测大家可能都知道,这个版本的COCO一共有如下80个类别:但是针对某些特定的场景,你可能只需要检测出其中的一种或者多种,例如只检测'traffic light'这一类,而不检测其他的类该怎么做呢?其实解决这个问题的办法很简单,每次调用detect对图像处理后,都可以得到一系列b..._maskrcnn预训练权重

docker里安装nginx容器、同时配置多个nginx容器_liunx安装了docker nginx可以再安装一个nginx吗-程序员宅基地

文章浏览阅读1.6w次,点赞5次,收藏16次。本篇文章主要介绍在Linux(Centons7)下安装docker的中安装nginx容器,以下分为大概步骤和详细步骤,也会把一些遇到的坑和解决方案经验分享给大家,nginx容器安装其实就是下载启动即可,配置多个nginx需要额外修改即可。Docker的三大核心概念:镜像、容器、仓库镜像:类似虚拟机的镜像、用俗话说就是安装文件。容器:类似一个轻量级的沙箱,容器是从镜像创建应用运行实例,..._liunx安装了docker nginx可以再安装一个nginx吗

vue-cli3代理解决跨域_vue代理转接的名称会被携带给服务器吗-程序员宅基地

文章浏览阅读1.5k次。在vue中使用proxy进行跨域的原理是:将域名发送给本地的服务器(启动vue项目的服务,loclahost:8080),再由本地的服务器去请求真正的服务器。在vue.config.js文件(cli3会自动生成,如果没有就在根目录新建一个)中的devServer.proxy这个对象进行配置,其中devServer.proxy指向一个开发环境下的服务器API地址,配置如下:module.exports = { lintOnSave: false, //关闭eslint检测\ devServer:{_vue代理转接的名称会被携带给服务器吗

python中nan值判断与处理_np.isnan判断数组每行数据,均值填补上-程序员宅基地

文章浏览阅读1.7w次,点赞12次,收藏57次。查看空值df.head() #查看前5行数据np.isnan(df).sum() #获得nan的数量np.isinf(df).sum() #获得infinity的数量df.isnull().any() #判断哪些”列”存在缺失值df[df.isnull().T.any().T] #找出含有nan的所有行空置处理填充#空值处理方式data.fillna(data.mea..._np.isnan判断数组每行数据,均值填补上

hdf5安装_Ubuntu18.04+GCC9.2.1源码编译HDF5(1.10.6)-程序员宅基地

文章浏览阅读862次。由于HDF5在CGNS数据库中用到,而CGNS数据库是国产CFD开源软件OneFLOW用到的核心数据库,在此简单介绍一下linux下的HDF5源代码编译安装过程。前面很多地方可以参考这篇文章,是一样的。迦非喵:Win10+VS2019源码编译HDF5(1.10.6)​zhuanlan.zhihu.com源码下载完毕后进行编译安装,本文在Ubuntu18.04下的目录为/home/eric/soft..._gcc 安装hdf5

推荐文章

热门文章

相关标签