Tomcat JDBC Conencton Pool + MySQL 会出现“Broken pipe”问题,即使有连接验证

Posted

技术标签:

【中文标题】Tomcat JDBC Conencton Pool + MySQL 会出现“Broken pipe”问题,即使有连接验证【英文标题】:Tomcat JDBC Conencton Pool + MySQL gives "Broken pipe" problems, even with connection validation 【发布时间】:2014-05-30 22:20:18 【问题描述】:

我正在努力配置 Tomcat JDBC 连接池以实现可靠性。当前的问题是,在测试环境中,我在 webapp 中有这样的扫描仪:

第 1 天:一切正常 第 2 天:webapp 无法与 mysql 通信几个小时,日志中有很多“Broken pipe” 第 3 天:令人惊讶的是,一切都再次正常运行(无需插入或重新启动)

我已经配置了validationIntervalvalidationQueryvalidationTimeout。这是我的数据源配置:

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="username" value="$dbUser" />
    <property name="password" value="$dbPass" />
    <property name="url" value="$dbUrl" />
    <property name="defaultAutoCommit" value="false" />
    <property name="defaultTransactionIsolation">
    <util:constant static-field="java.sql.Connection.TRANSACTION_SERIALIZABLE" />
    </property>

    <property name="maxActive" value="300" />
    <property name="maxIdle" value="25" />
    <property name="initialSize" value="5" />

    <property name="validationInterval" value="5000" />
    <property name="validationQuery" value="SELECT 1"/>
    <property name="validationQueryTimeout" value="3" />

    <property name="minIdle" value="5" />
    <property name="initSQL" value="SET time_zone = '+00:00';" />
</bean>

我在连接 URL 中没有 autoReconnect=true 参数,只有 UTF8 编码。

确切的错误是:

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
The last packet successfully received from the server was 38,700,615
milliseconds ago.  The last packet sent successfully to the server was
38,700,615 milliseconds ago. is longer than the server configured
value of 'wait_timeout'. You should consider either expiring and/or
testing connection validity before use in your application, increasing
the server configured values for client timeouts, or using the
Connector/J connection property 'autoReconnect=true' to avoid this
problem.
Caused by: java.net.SocketException: Broken pipe

【问题讨论】:

@SanjayRajjadi 不,不是。是配置问题。阅读消息。 “断管”主要是应用程序协议问题。 @SanjayRajjadi MySQL 在同一台机器上,连接到 localhost。 【参考方案1】:

我们的一个应用程序遇到了一些类似的问题,经过大量挖掘后,我们添加了以下属性来解决我们所有的连接问题:

maxAge="180000" 
testOnBorrow="true" 
testWhileIdle="true"
validationInterval="0" //forces the connection pool to validate each time a connection is given to the application

【讨论】:

在哪里定义这些选项?我想我遇到了同样的问题... 您可以在数据源的 xml 配置中添加这些选项,如原始问题所示。我只是添加了我们使用的值以便于参考。您必须使用&lt;property name="whatever" value="somevalue"&gt; 格式才能获取设置 啊,是的,我想了很多,但这似乎不是我正在努力解决的问题 ;) 无论如何,谢谢你回来! @E.V.d.B.没问题!【参考方案2】:

您需要将“testOnBorrow”设置为“true”,并且可能将“maxAge”设置为小于服务器配置的“wait_timeout”,如消息中所示。

【讨论】:

以上是关于Tomcat JDBC Conencton Pool + MySQL 会出现“Broken pipe”问题,即使有连接验证的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat 和 JDBC

tomcat 7 jdbc连接池和jdbc4验证

SFA官方翻译Spring Boot中配置Tomcat连接池

带有 JDBC 的 tomcat 6.0 抛出 ClassNotFoundException com.mysql.jdbc.Connection

text POO - Listas

text POO js2