kaka的gravatar头像
kaka2017-09-07 17:39:20
mysql抛出Communications link failure数据库链接失败问题记录

最近项目中偶尔会出现如下的异常:

Communications link failure,The last packet successfully received from the server...,如下截图:

mysql抛出Communications link failure数据库链接失败问题记录

这个问题的出现时使用连接池导致的,查看了下我们mysql的设置,发现wait_timeout参数设置为300s,如下截图:

mysql抛出Communications link failure数据库链接失败问题记录

druid的配置如下:

<!-- 配置数据源通用属性 -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<!-- 初始化连接大小 -->
		<property name="initialSize" value="5" />
		<!-- 连接池最大使用连接数量 -->
		<property name="maxActive" value="20" />
		<!-- 连接池最小空闲 -->
		<property name="minIdle" value="5" />
		<!-- 获取连接最大等待时间 -->
		<property name="maxWait" value="60000" />
		<property name="validationQuery" value="SELECT 1" />
		<property name="testOnBorrow" value="false" />
		<property name="testOnReturn" value="false" />
		<property name="testWhileIdle" value="true" />
		<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
		<property name="timeBetweenEvictionRunsMillis" value="3600000" />
		<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
		<property name="minEvictableIdleTimeMillis" value="300000" />
		<!-- 打开removeAbandoned功能 -->
		<property name="removeAbandoned" value="true" />
		<!-- 1800秒,也就是30分钟 连接超过3分钟自动关闭-->
		<property name="removeAbandonedTimeout" value="1800" />
		<!-- 关闭abanded连接时输出错误日志 -->
		<property name="logAbandoned" value="true" />
		<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
		<!-- 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。5.5及以上版本有PSCache,建议开启。缺省值:false -->
        <property name="poolPreparedStatements" value="true" />  
        <property name="maxPoolPreparedStatementPerConnectionSize" value="20" />  
		<!-- 监控统计拦截的filters -->
		<!-- <property name="filters" value="log4j,stat" /> -->
		<property name="proxyFilters">
		    <list>
		   		<ref bean="stat-filter" />
		   		<ref bean="log-filter"/>
		    </list> 
		</property>
	</bean> 
	

根据异常报错分析,该连接上一次成功接收到mysql的返回是在323s之前,也就是说该链接的空闲时间超过了300s,mysql会自动断开该连接,而连接池认为该连接是有效的,当项目申请使用该连接时,就会报Communications link failure的错误。

解决办法就是根据项目的情况,调整wait_timeout这个参数吧

更新于2017.09.08日,后来我看了下上面的druid配置,发现testOnBorrow设置成false了,这个设置为true表示每次从连接池取连接需要进行一次有效性校验,把这个设置成true后,经过一段时间的测试,再也没有出现过如上的错误,不需要修改mysql配置文件的wait_timeout参数其实。

<property name="testOnBorrow" value="false" />

打赏

已有1人打赏

最代码官方的gravatar头像

分享到:

最近浏览
紫梦幻10月13日
暂无贡献等级
王庆乾wdq10月7日
最代码贡献等级说明
chen888 LV29月21日
最代码贡献等级说明
暂无贡献等级
stwl1239月16日
暂无贡献等级
luomazkf9月15日
暂无贡献等级
junwuxie9月13日
最代码贡献等级说明
UIleader9月13日
最代码贡献等级说明
2037785139月13日
暂无贡献等级
附耳聆听9月12日
最代码贡献等级说明
branice9月12日
最代码贡献等级说明
4129402269月10日
暂无贡献等级
godman9月10日
最代码贡献等级说明
暂无贡献等级
最代码官方 LV49月8日
最代码贡献等级说明
wawahei9月8日
暂无贡献等级
182028382089月8日
暂无贡献等级
最代码广告位
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友