﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-六岁就很酷</title><link>http://www.blogjava.net/chencao/</link><description>思想是精髓</description><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 05:17:07 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 05:17:07 GMT</pubDate><ttl>60</ttl><item><title>Communications link failure due to underlying exception </title><link>http://www.blogjava.net/chencao/archive/2007/08/08/135131.html</link><dc:creator>陈操</dc:creator><author>陈操</author><pubDate>Wed, 08 Aug 2007 00:27:00 GMT</pubDate><guid>http://www.blogjava.net/chencao/archive/2007/08/08/135131.html</guid><wfw:comment>http://www.blogjava.net/chencao/comments/135131.html</wfw:comment><comments>http://www.blogjava.net/chencao/archive/2007/08/08/135131.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chencao/comments/commentRss/135131.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chencao/services/trackbacks/135131.html</trackback:ping><description><![CDATA[最近的一个项目在Hibernate使用C3P0的连接池，数据库为Mysql。开发测试没有问题，在运行中每个一段长的空闲时间就出现异常:
<div class=code_title>java 代码</div>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-j>
    <li class=alt><span><span>org.hibernate.exception.JDBCConnectionException:&nbsp;could&nbsp;not&nbsp;execute&nbsp;query &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:</span><span class=number>74</span><span>) &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:</span><span class=number>43</span><span>) &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;....... &nbsp;&nbsp;</span>
    <li class=alt><span>Caused&nbsp;by:&nbsp;com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException:&nbsp;No&nbsp;operations&nbsp;allowed&nbsp;after&nbsp;connection&nbsp;closed.Connection&nbsp;was&nbsp;implicitly&nbsp;closed&nbsp;due&nbsp;to&nbsp;underlying&nbsp;exception/error: &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;</span>
    <li class=""><span>**&nbsp;BEGIN&nbsp;NESTED&nbsp;EXCEPTION&nbsp;**&nbsp; &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;</span>
    <li class=""><span>com.mysql.jdbc.CommunicationsException &nbsp;&nbsp;</span>
    <li class=alt><span>MESSAGE:&nbsp;Communications&nbsp;link&nbsp;failure&nbsp;due&nbsp;to&nbsp;underlying&nbsp;exception:&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class=alt><span>**&nbsp;BEGIN&nbsp;NESTED&nbsp;EXCEPTION&nbsp;**&nbsp; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class=alt><span>java.net.SocketException &nbsp;&nbsp;</span>
    <li class=""><span>MESSAGE:&nbsp;Broken&nbsp;pipe &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;</span>
    <li class=""><span>STACKTRACE: &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;</span>
    <li class=""><span>java.net.SocketException:&nbsp;Broken&nbsp;pipe &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;java.net.SocketOutputStream.socketWrite0(Native&nbsp;Method) &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;...... &nbsp;&nbsp;</span>
    <li class=alt><span>**&nbsp;END&nbsp;NESTED&nbsp;EXCEPTION&nbsp;** &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>查看了Mysql的文档，以及Connector/J的文档以及在线说明发现，出现这种异常的原因是：</p>
<p>&nbsp;&nbsp; Mysql服务器默认的&#8220;wait_timeout&#8221;是8小时，也就是说一个connection空闲超过8个小时，Mysql将自动断开该connection。这就是问题的所在，在C3P0 pools中的connections如果空闲超过8小时，Mysql将其断开，而C3P0并不知道该connection已经失效，如果这时有Client请求connection，C3P0将该失效的Connection提供给Client，将会造成上面的异常。</p>
<p>解决的方法有3种：</p>
<ol>
    <li>增加wait_timeout的时间。
    <li>减少Connection pools中connection的lifetime。
    <li>测试Connection pools中connection的有效性。 </li>
</ol>
<p>当然最好的办法是同时综合使用上述3种方法，下面就DBCP和C3P0分别做一说明，假设wait_timeout为默认的8小时</p>
<p>DBCP增加以下配置信息:</p>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-j>
    <li class=alt><span><span class=comment>//set&nbsp;to&nbsp;'SELECT&nbsp;1' </span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>validationQuery&nbsp;=&nbsp;</span><span class=string>"SELECT&nbsp;1"</span><span>&nbsp;&nbsp;</span>
    <li class=alt><span></span><span class=comment>//set&nbsp;to&nbsp;'true' </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>testWhileIdle&nbsp;=&nbsp;</span><span class=string>"true"</span><span>&nbsp; &nbsp;&nbsp;</span>
    <li class=alt><span></span><span class=comment>//some&nbsp;positive&nbsp;integer </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>timeBetweenEvictionRunsMillis&nbsp;=&nbsp;</span><span class=number>3600000</span><span>&nbsp;&nbsp;</span>
    <li class=alt><span></span><span class=comment>//set&nbsp;to&nbsp;something&nbsp;smaller&nbsp;than&nbsp;'wait_timeout' </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>minEvictableIdleTimeMillis&nbsp;=&nbsp;</span><span class=number>18000000</span><span>&nbsp;&nbsp;</span>
    <li class=alt><span></span><span class=comment>//if&nbsp;you&nbsp;don't&nbsp;mind&nbsp;a&nbsp;hit&nbsp;for&nbsp;every&nbsp;getConnection(),&nbsp;set&nbsp;to&nbsp;"true" </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>testOnBorrow&nbsp;=&nbsp;</span><span class=string>"true"</span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>C3P0增加以下配置信息:</p>
<div class=dp-highlighter>
<div class=bar></div>
<ol class=dp-j>
    <li class=alt><span><span class=comment>//set&nbsp;to&nbsp;'SELECT&nbsp;1'&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>preferredTestQuery&nbsp;=&nbsp;'SELECT&nbsp;</span><span class=number>1</span><span>'&nbsp; &nbsp;&nbsp;</span>
    <li class=alt><span>&nbsp;</span><span class=comment>//set&nbsp;to&nbsp;something&nbsp;much&nbsp;less&nbsp;than&nbsp;wait_timeout,&nbsp;prevents&nbsp;connections&nbsp;from&nbsp;going&nbsp;stale </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>idleConnectionTestPeriod&nbsp;=&nbsp;</span><span class=number>18000</span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span>
    <li class=alt><span></span><span class=comment>//set&nbsp;to&nbsp;something&nbsp;slightly&nbsp;less&nbsp;than&nbsp;wait_timeout,&nbsp;preventing&nbsp;'stale'&nbsp;connections&nbsp;from&nbsp;being&nbsp;handed&nbsp;out </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>maxIdleTime&nbsp;=&nbsp;</span><span class=number>25000</span><span>&nbsp; &nbsp;&nbsp;</span>
    <li class=alt><span></span><span class=comment>//if&nbsp;you&nbsp;can&nbsp;take&nbsp;the&nbsp;performance&nbsp;'hit',&nbsp;set&nbsp;to&nbsp;"true" </span><span>&nbsp;&nbsp;</span>
    <li class=""><span>testConnectionOnCheckout&nbsp;=&nbsp;</span><span class=keyword>true</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>更多的配置信息大家可以查看C3P0文档，Connector/J文档，以及DBCP的文档。</p>
<img src ="http://www.blogjava.net/chencao/aggbug/135131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chencao/" target="_blank">陈操</a> 2007-08-08 08:27 <a href="http://www.blogjava.net/chencao/archive/2007/08/08/135131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>