java.sql.SQLRecoverableException: IO Error: Broken pipe

1 错误信息

ERROR [com.alibaba.druid.util.JdbcUtils] - close connection error
java.sql.SQLRecoverableException: IO Error: Broken pipe

2 分析

遇到这个问题,一般是程序访问服务(比如数据库)时遇到的。这之间存在着好几个网络 通信节点:

程序 –> 连接池 –> 网卡 –> 防火墙 –> 路由器 –> 防火墙 —> 服务端网卡 —> 服务端静态路由 –> 服务端防火墙 –> 服务监听 –> 服务

除了程序与连接池(一般集成在一起),其他任何一个节点中断连接,都有可能引发这个问 题,尤其是防火墙。而一般将某个连接中断原因,是因为这个连接空闲了太长的时间(保持 连接却不做任何事情)。网络防火墙、tcp网络、服务器本地防火墙、监听这几个节点上都 有空闲连接控制。

下面分别通过配置连接池、服务器上的tcp网络、数据库层面、来解决空闲连接被异常中 断的问题。

2.1 连接池

现在国内大都使用druid 作为程序的连接池。那么该连接池针对空闲连接提供了检测和 校验机制。比如在申请使用该连接时,先测试该连接是否可用,定时检查空闲连接是否 可用等,空闲连接定时执行无意义的SQL以保证会话被验证为alive,推荐配置如下:

spring.datasource.druid.test-while-idle=true
spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
spring.datasource.druid.validation-query-timeout=1000
sping.datasource.druid.min-Evictable-Idle-Time-Millis=300000
sping.datasource.druid.time-Between-Eviction-Runs-Millis=3000
spring.datasource.druid.keep-alive=true
spring.datasource.druid.remove-abandoned=true
spring.datasource.druid.remove-abandoned-timeout=3600
spring.datasource.druid.log-abandoned=true

一般使用以上配置后,就不会再出现连接中断的问题。

2.2 TCP网络

  • keepalive 类Unix系统上,TCP 连接的 keepalive 可以在应用层实现,也可以在 TCP 中提供。 这个问题存在争议,因此 TCP 连接的保活探测并不是 TCP 规范中的一部分。但为了方便 ,几乎所有类 Unix 系统均在 TCP 中提供了相应的功能。

    常见类UNIX系统中的tcp keepalive:

    操作系统 保活定时器
    AIX # no -a | grep keep
      tcp_keepcnt = 8
      tcp_keepidle = 14400
      tcp_keepintvl = 150
    Linux # sysctl -A | grep keep
      net.ipv4.tcp_keepalive_intvl = 75
      net.ipv4.tcp_keepalive_probes = 9
      net.ipv4.tcp_keepalive_time = 7200
    FreeBSD #sysctl -A | grep net.inet.tcp
      net.inet.tcp.keepidle=…
      net.inet.tcp.keepintvl=…

    不同系统上的各参数的时间单位不尽相同。在 AIX 上, tcp_keeidle/tcp_keepinit/tcp_keepintvl 的时间单位是 0.5 秒;而在 Linux 上, net.ipv4.tcp_keepalive_intvl 和 net.ipv4.tcp_keepalive_time 的时间单位则为秒。并 且,上述参数仅对运行在其上的服务器应用连接有效。

    note
    在 Solaris 上可通过“ndd /dev/tcp \?”命令显示上述类似参数信息,而在 HP

    Unix 上则可通过 nettune 或 ndd 命令进行查询。

    由于所有类 Unix 系统上均支持这种功能,因此,在接下来的部分中我们将基于 AIX 系统 具体讲述上述参数的意义和作用机制。

    控制参数 参数说明
    tcp_keepcnt 关闭一个非活跃连接之前进行探测的最大次数,默认为 8 次
    tcp_keepidle 对一个连接进行有效性探测之前运行的最大空闲时长,默认值为 14400(即 2 个小时)
    tcp_keepintvl 两个探测的时间间隔,默认值为 150 即 75 秒

    我们要通过设置这些参数,使其控制时间间隔要小于防火墙设置的最大空闲时间,如果不了 解防火墙的设置,可以将该tcp_keepintvl的值设置为3分钟以内,一般网络防火墙对于 空闲会话的限制不会短于这个时间。

  • tcp retries 这里有另外一个现象,当连接被异常中断,但是程序这端的服务器没有收到相关终止信息 时,由原来存在的会话继续发送报文时,不会得到反馈,超过一定时间后,TCP会重新发 送该报文,直到超过最大允许重发次数。所以,有些时间,程序收到broken pipe 信息 时,是在一段时间以后(常见的是15分钟)。而在测试、开发人员的眼中,就是业务从开 始执行到报错, 中间等待了很久,比如15分钟。这里涉及到Linux内核对tcp 重发报文 次数的控制: net.ipv4.tcp_retries2 ,可以通过文件/proc/sys/net/ipv4/tcp_retries2 进行临时调整。

    其规则是:配置重传次数小于9的话,就是指数增长时间,如果大于9的话,就是最大超时时间.

    TCP_RTO_MIN=(HZ/5)=0.2s

    TCP_RTO_MAX=(120HZ)=120s

    linear_backoff_thresh = ilog2(1205)=ilog2(0x258)=9

    timeout:未超过linear_backoff_thresh=9的部分按TCP_RTO_MIN 2的指数倍增长,超过 的部分按TCP_RTO_MAX线性增长

    比如:

    sysctl_tcp_retries2=9,则timeout=1023TCP_RTO_MIN=204.6s sysctl_tcp_retries2=11时,timeout=1023TCP_RTO_MIN+2TCP_RTO_MAX=448.6s

针对这个问题,我们可以将重传次数设置得小一些。比如设置为3.

2.3 数据库监听

数据库也会把一些长时间没有任何操作的会话给kill掉,并不会给出任何的反馈。当程序 使用长连接,再次请求这些会话时,就会遇到报错。从数据库角度来讲,可以把空闲时间 设置得更长一些,但是这样是存在风险的,日积月累后,数据库中可能存在大量的空闲连 接,由于数据库一般会限制最大连接数的。如果大量的空闲连接存在,可能导致新的连接 无法建立。

  • ORACLE oracle中对空闲会话的检测是在$ORACLE_HOME/network/admin/sqlnet.ora中配置

的,参数是sqlnet.expire_time ,单位是秒。比如:

sqlnet.expire_time=180
  • MySQL 设置wait_timeout 指定空闲时间,单位是秒,最长不建议超过1天。

Author: halberd.lee

Created: 2019-09-26 Thu 21:20

Validate

close connection error java.sql.SQLRecoverableException: IO Error: Broken pipe的更多相关文章

  1. 解决weblogic错误:java.sql.SQLRecoverableException: IO Error: Broken pipe

    首先说一下系统基础架构: 服务器:weblogic11g集群 数据库:oracle数据库Rac 出错信息: 1.java.sql.SQLRecoverableException: Closed Con ...

  2. [ORACLE]java.sql.SQLRecoverableException: IO Error: Connection rese

    随机数引起的阻塞问题 程序通过 java -jar -Djava.security.egd=file:/dev/./urandom xxx 的方式执行, http://hongjiang.info/j ...

  3. 在linux上通过JDBC连接ORACLE 时总是出现 java.sql.SQLRecoverableException: IO Error: Connection reset 的问题

    如标题所述,经过和度娘沟通了不知道多少遍最后看一篇文章解决, 我是通过执行jar来操作DB的.所以在命令中加了一个参数( 加粗,红色) eg: $JAVA_EXE -Djava.security.eg ...

  4. spring+ibatis问题1—— 程序报错:java.sql.SQLException: Io 异常: Connection reset by peer, socket write error; ”或“java.sql.SQLException 关闭的连接”异常

    转自:http://blog.sina.com.cn/s/blog_1549fb0710102whz2.html spring+ibatis程序测试时报错:java.sql.SQLException: ...

  5. 关于java.sql.SQLRecoverableException: Closed Connection异常的解决方案(转)

    在项目中碰到了一个应用异常,从表象来看应用僵死.查看Weblogic状态为Running,内存无溢出,但是出现多次线程堵塞.查看Weblogic日志,发现程序出现多次Time Out. 我们知道,We ...

  6. java.sql.SQLException: Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=186646784)(ERR=12505)(ERR

    dbc 链接orcal出错 java.sql.SQLException: Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=186646784)( ...

  7. Caused by: java.sql.BatchUpdateException: Transaction error, need to rollback. errno:1205 Lock wait timeout exceeded; try restarting transaction

    更新的时候报 Caused by: java.sql.BatchUpdateException: Transaction error, need to rollback. errno:1205 Loc ...

  8. java.sql.SQLException: Io 异常: Connection reset

    当数据库连接池中的连接被创建而长时间不使用的情况下,该连接会自动回收并失效,但客户端并不知道,在进行数据库操作时仍然使用的是无效的数据库连接,这样,就导致客户端程序报“ java.sql.SQLExc ...

  9. NC57访问报错:java.sql.SQLException: Io 异常: Got minus one from a read call

    一.报错信息 1.  前端登录界面 2.  后台应用日志 报错信息一致为: $$callid= $$thread=[Service Monitor and Runtime Enroment] $$ho ...

随机推荐

  1. 简单介绍 Java 构造器

    导读 构造器是编程的强大组件.使用它们来释放 Java 的全部潜力. 在开源.跨平台编程领域,Java 无疑(?)是无可争议的重量级语言.尽管有许多伟大的跨平台框架,但很少有像 Java 那样统一和直 ...

  2. EasyUI中取的DataGrid中选中行数据

    dataGrid中显示列:ItemID,ItemCode,ItemName,Note 一.选中一行 var selRow = $('#dataGrid').datagrid('getSelected' ...

  3. 记一次引用maven插件报错解决方法

    1.报错信息如图: plugin org.springframework.boot:spring-boot-maven-plugin not found 2.解决方案: maven的配置文件[sett ...

  4. Ubuntu系统---安装搜狗输入法

    Ubuntu_搜狗输入法 第一步: 1,下载搜狗输入法的安装包. 下载地址为:http://pinyin.sogou.com/linux/ ,如下图,要选择与自己系统位数一致的安装包,我的系统是64位 ...

  5. python批量下载邮件附件

    背景 由于同学每周要通过邮箱收数学建模作业,100多人给她发附件,她要一个个地点着下载. 太麻烦了,所以想用程序实现下载附件的功能. 在网上查资料后,最终实现了稍为简单的下载附件功能,代码有些细节还不 ...

  6. MYSQL安全模式SQL语法需要注意的地方

    MYSQL安全模式 Mysql版本: 背景: 为了避免在执行delete.update将全表数据清空或者覆盖修改,在新项目营销云中开启了mysql的安全模式. 安全模式要求不能对非主键的条件查询做up ...

  7. Math.pow

    一个Math函数,例如:Math.pow(4,3);返回4的三次幂,用法:Math.pow(x,y) x 必需传.底数.必须是数字. y 必需传.幂数.必须是数字. 如果结果是虚数或负数,则该方法将返 ...

  8. 【Android-自定义控件】 漂亮的Toast

    修改Toast属性,美化Toast //创建一个Toast Toast toast=new Toast(getApplicationContext()); //创建Toast中的文字 TextView ...

  9. selenium+pyquery爬取淘宝商品信息

    import re from selenium import webdriver from selenium.common.exceptions import TimeoutException fro ...

  10. js中Ajax工作原理(转)

    在写这篇文章之前,曾经写过一篇关于AJAX技术的随笔,不过涉及到的方面很窄,对AJAX技术的背景.原理.优缺点等各个方面都很少涉及null.这次写这篇文章的背景是因为公司需要对内部程序员做一个培训.项 ...