[MySQL]Software caused connection abort: recv failed 问题

错误描述:

项目运行一段时间(大概几个小时)之后访问时会出现第一次访问报错,再次访问正常的现象,且多次出现此问题  

此问题可能原因有两个:

1.mysql超时时间短与连接池超时时间

2.mysql驱动jar包版本低

 

MySQL服务器默认的“wait_timeout”是28800秒即8小时,意味着如果一个连接的空闲时间超过8个小时,MySQL将自动断开该连接,而连接池却认为该连接还是有效的(因为并未校验连接的有效性),当应用申请使用该连接时,就会导致上面的报错

mysql客户端查看mysql超时时间:show variables like '%timeout%';

 


[MySQL]Software caused connection abort: recv failed 问题_第1张图片
 

解决方案( 解决这个问题的办法有三种,推荐第二种 ):

1. 增加 MySQL 的 wait_timeout 属性的值 

修改mysql安装目录下的配置文件 my.ini文件(如果没有此文件, 复制“my-default.ini”文件,生成“复件 my-default.ini”文件。 将“复件 my-default.ini”文件重命名成“my.ini” ),在文件中设置: 


wait_timeout=31536000
interactive_timeout=31536000

这两个参数的默认值是8小时(60*60*8=28800)。

2. 减少连接池内连接的生存周期

减少连接池内连接的生存周期, 使之小于 上一项中所设置的 wait_timeout 的值 。 

修改 c3p0 的配置文件, 在 Spring 的配置文件中设置:

<bean id="dataSource"  class="com.mchange.v2.c3p0.ComboPooledDataSource">  
<property name="maxIdleTime"value="1800"/>  
  
bean>

3. 定期使用连接池内的连接

定期使用连接池内的连接,使得它们不会因为闲置超时而被 MySQL 断开。  

修改 c3p0 的配置文件,在  Spring 的配置文件中设置:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">  
<property name="preferredTestQuery" value="SELECT 1"/>  
<property name="idleConnectionTestPeriod" value="18000"/>  
<property name="testConnectionOnCheckout" value="true"/>  
bean>

知识扩展

C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。 c3p0配置文件

<default-config> 
   
  <property name="acquireIncrement">3property> 
   
  <property name="acquireRetryAttempts">30property> 
   
  <property name="acquireRetryDelay">1000property> 
   
  <property name="autoCommitOnClose">falseproperty> 
   
  <property name="automaticTestTable">Testproperty> 
   
  <property name="breakAfterAcquireFailure">falseproperty> 
   
  <property name="checkoutTimeout">100property> 
   
  <property name="connectionTesterClassName">property> 
   
  <property name="factoryClassLocation">nullproperty> 
   
  <property name="forceIgnoreUnresolvedTransactions">falseproperty> 
   
  <property name="idleConnectionTestPeriod">60property> 
   
  <property name="initialPoolSize">3property> 
   
  <property name="maxIdleTime">60property> 
   
  <property name="maxPoolSize">15property> 
   
  <property name="maxStatements">100property> 
   
  <property name="maxStatementsPerConnection">property> 
   
  <property name="numHelperThreads">3property> 
   
  <property name="overrideDefaultUser">rootproperty> 
   
  <property name="overrideDefaultPassword">passwordproperty> 
   
  <property name="password">property> 
   
  <property name="preferredTestQuery">select id from test where id=1property> 
   
  <property name="propertyCycle">300property> 
   
  <property name="testConnectionOnCheckout">falseproperty> 
   
  <property name="testConnectionOnCheckin">trueproperty> 
   
  <property name="user">rootproperty> 
  在Hibernate(spring管理)中的配置: 
  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
  <property name="driverClass"><value>oracle.jdbc.driver.OracleDrivervalue>property> 
  <property name="jdbcUrl"><value>jdbc:oracle:thin:@localhost:1521:Testvalue>property> 
  <property name="user"><value>Kayvalue>property> 
  <property name="password"><value>rootvalue>property> 
   
  <property name="minPoolSize" value="10" /> 
   
  <property name="maxPoolSize" value="100" /> 
   
  <property name="maxIdleTime" value="1800" /> 
   
  <property name="acquireIncrement" value="3" /> 
  <property name="maxStatements" value="1000" /> 
  <property name="initialPoolSize" value="10" /> 
   
  <property name="idleConnectionTestPeriod" value="60" /> 
   
  <property name="acquireRetryAttempts" value="30" /> 
  <property name="breakAfterAcquireFailure" value="true" /> 
  <property name="testConnectionOnCheckout" value="false" /> 
  bean> 
  ########################### 
  ### C3P0 Connection Pool### 
  ########################### 
  #hibernate.c3p0.max_size 2 
  #hibernate.c3p0.min_size 2 
  #hibernate.c3p0.timeout 5000 
  #hibernate.c3p0.max_statements 100 
  #hibernate.c3p0.idle_test_period 3000 
  #hibernate.c3p0.acquire_increment 2 
  #hibernate.c3p0.validate false 
  在hibernate.cfg.xml文件里面加入如下的配置: 
   
  <property name="hibernate.c3p0.max_size">20property> 
   
  <property name="hibernate.c3p0.min_size">5property> 
   
  <property name="hibernate.c3p0.timeout">120property> 
   
  <property name="hibernate.c3p0.max_statements">100property> 
   
  <property name="hibernate.c3p0.idle_test_period">120property> 
   
  <property name="hibernate.c3p0.acquire_increment">2property> 
   
  <property name="hibernate.c3p0.validate">trueproperty>

你可能感兴趣的:(数据库)