Mysql Broken pipe异常 Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.net.SocketException MESSAGE: Broken pipe STACKTRACE: java.net.SocketException: Broken pipe at java.net.SocketOutputStream.socke
Mysql Broken pipe异常
Communications link failure due to underlying exception:
** 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:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)这个exception中我们可以得出是关于Socket的问题, 那么肯定就是关于网络方面的原因, 比如mysql down了。 或者网络有问题连不上mysql。
mysql会自动关闭掉空闲时间大于wait_timeout的连接。wait_timeout在可以在mysql配置文件里配置,默认的值是28800也就是8个小时。也就是说如果一个connection在8个小时候之内没有用使用过过的话, mysql server会把这个connection销毁掉。 这就是发生这个问题的原因了。 那么如何解决呢? 我们一般都用连接池来保存连接, 一般连接池都会有许多参数让你的连接池更高效。 我们以c3p0作为例子。 http://www.mchange.com/projects/c3p0/index.html, 这个是c3p0的文档,里面有许多参数,但是我们只要注意这个参数就行了。 maxIdleTime以下是对这个参数的解释。
引用
maxIdleTime
Default: 0
Seconds a Connection can remain pooled but unused before being discarded. Zero means idle connections never expire. [See "Basic Pool Configuration"]
在c3p0中maxIdleTime的默认值是0,也就是说永远都不会被expire, 解决这个问题的办法就是设置maxIdleTime比mysql的wait_timeout的值小一些就行了。
Statement:The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn