【问题标题】:java.net.SocketException: Broken pipejava.net.SocketException:管道损坏
【发布时间】:2011-03-19 09:17:32
【问题描述】:

我每天都会收到此错误或我的 jsp 页面:

java.net.SocketException

消息:管道损坏

堆栈跟踪:

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)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
        at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2637)
        ....

重启tomcat服务后就正常了。 (我用hibernate连接mysql数据库)

【问题讨论】:

  • @Carl 我猜“为什么会发生这个异常?”
  • 您能否编辑您的问题以包含您的<session-factory>

标签: java mysql hibernate tomcat jdbc


【解决方案1】:

看起来您(部分)失去了与数据库的连接。 MySQL 尝试发送某些内容,但连接丢失。

另一个报告类似问题的 mysql/tomcat 用户被建议使用连接池,例如c3p0。用户回复说他想先使用Mysql/tomcat连接池,如mysqls reference manual中所述。

This is original post (german language).

【讨论】:

  • 他使用的是 Hibernate,默认情况下通常已经配置为使用连接池。看起来像是不正确的 Hibernate 连接池配置。
【解决方案2】:

我每天都会收到此错误或我的 JSP 页面 (...)

我会推测一下,但如果这种情况每天早上都发生(即在一夜不活动之后),那么这可能与 MySQL 默认在 8 小时后关闭空闲连接的事实有关(wait_timeout) .

如果是这种情况,则:

  • 使用数据源配置中的 validationQuery 配置 tomcat 以测试借用连接:

    <parameter>
      <name>validationQuery</name>
      <value>select 1</value>
    </parameter>
    
  • 通过my.cnf/my.ini 增加MySQL 的wait_timeout,或通过连接命令行SQL 客户端并输入SET GLOBAL wait_timeout=86400,或其他合适的秒数。

我不知道第二个选项的所有后果,也不真正推荐它,至少在没有从 MySQL 专家那里得到更多反馈的情况下是这样。

【讨论】: