使用DBCP连接池时出现过一段时间断开连接的解决方法

问题:

** BEGIN NESTED EXCEPTION **

  java.net.SocketException 
  MESSAGE: Broken pipe
  
  STACKTRACE:

  java.net.SocketException: Broken pipe
  at java.net.SocketOutputStream.socketWrite0(Native Method)
  at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
  at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
  at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)
  
  ** END NESTED EXCEPTION **
  
  Last packet sent to the server was 1 ms ago.

at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTrans(SQLStateSQLExceptionTranslator.java:103)
  
  Caused by: com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

 

一.解决方法

  1.空闲连接驱逐的周期

  •         设置空闲连接驱逐周期

         <property name="minEvictableIdleTimeMillis " value="800000"/> 

          注:此处值为毫秒 此值要小于数据库断开连接的时间

  •        查询数据库等待时间

     show global variables like ‘wait_timeout’;

     注:此处时间为秒

(注:此方法对于一些版本com.mysql.jdbc.Driver驱动可能不生效,方法2测试生效,请选择性测试使用)

2.设置从连接池取连接的时候进行有效性检查

  •      <property name="testOnBorrow" value="true"/>  
  •      <property name="validationQuery" value="select 1"/>

二.线程池属性

具体查看官网: http://commons.apache.org/proper/commons-dbcp/configuration.html

initialSize: 
池启动时创建的连接数量

maxActive:
同一时间可以从池分配的最多连接数量。设置为0时表示无限制。

maxIdle:
池里不会被释放的最多空闲连接数量。设置为0时表示无限制。

maxOpenPreparedStatements:
同一时间能够从语句池里分配的已备语句的最大数量。设置为0时表示无限制。

maxWait [官网为:maxWaitMillis,但实际是用前面的]:
在抛出异常之前,池等待连接被回收的最长时间(当没有可用连接时)。设置为-1表示无限等待。

minEvictableIdleTimeMillis:
连接保持空闲而不被驱逐的最长时间。

minIdle:
在不新建连接的条件下,池中保持空闲的最少连接数。

poolPreparedStatements:
是否对已备语句进行池管理(布尔值)。

timeBetweenEvictionRunsMillis: 
毫秒秒检查一次连接池中空闲的连接,

minEvictableIdleTimeMillis:
把空闲时间超过minEvictableIdleTimeMillis毫秒的连接断开, 直到连接池中的连接数到minIdle为止 连接池中连接可空闲的时间,毫秒 

defaultAutoCommit:
默认的SQL语句自动提交状态(开启或关闭)设置由连接池本身设置(false由连接池定),不设置该值setAutoCommit方法不被调用;

validationQuery:
要求必需是个SELECT类型的SQL语句,至少返回一行,由于它会在所有应用的SQL语句执行之前运行一次,所以原则上应该对数据库服务器带来的压力越小越好,推荐使用“SELECT 1”

testOnBorrow:
表示从连接池中获取连接前是否运行validationQuery,true=运行[默认],false=不运行;

testOnReturn:
表示将连接归还连接池前是否运行validationQuery,true=运行,false=不运行[默认];

应该注意各个参数的设置情况,应该根据具体的项目情况,以及需要的性能等情况而定
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值