【问题标题】:Broken Pipe in Hibernate applicationHibernate 应用程序中的断管
【发布时间】:2018-08-13 09:38:11
【问题描述】:

我在 Tomcat 8 引擎中有一个应用程序,它同时具有:与两个不同数据库的 JDBC 和 Hibernate 连接。用户不活动 3-4 小时后,Hibernate 连接失败 我在 hibernate.cfg.xml 中也有 c3p0 属性

hibernate.c3p0.min_size 1

hibernate.c3p0.idle_test_period 100

异常堆栈跟踪:

STACKTRACE:

com.mysql.jdbc.CommunicationsException: 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:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2637)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1554)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3176)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1153)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1266)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:116)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:80)
at org.hibernate.loader.Loader.getResultSet(Loader.java:2065)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1838)
at org.hibernate.loader.Loader.doQuery(Loader.java:909)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
at org.hibernate.loader.Loader.doList(Loader.java:2551)
at org.hibernate.loader.Loader.doList(Loader.java:2537)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2367)
at org.hibernate.loader.Loader.list(Loader.java:2362)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:496)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:229)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1260)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
at DAO.CarsDAOimpl.getData(CarsDAOimpl.java:121)

有人知道发生了什么以及如何解决这个问题吗? UPD:这是关于内存状态的: 运行时运行时 = Runtime.getRuntime(); long freeMemory = runtime.freeMemory(); ... 空闲内存:183787192

【问题讨论】:

  • 我已经看到中间防火墙(在我们的例子中为检查点)在长时间运行的连接中导致连接超时。 c3p0 中的maxConnectionAge 参数看起来对阻止连接保持打开时间过长很有用。
  • 它对我不起作用。同样的例外

标签: java hibernate tomcat8


【解决方案1】:

是的,我也遇到了同样的问题。尝试将验证查询添加到您的数据源。

这是我的定义:

<Resource auth="Container"
          type="javax.sql.DataSource"
          name="jdbc/mydb"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost/mydb"
          maxActive="10"
          maxIdle="5"
          validationQuery="SELECT 1"
          testOnBorrow="true"
          testWhileIdle="true"
          timeBetweenEvictionRunsMillis="10000"
          minEvictableIdleTimeMillis="60000"
          username="..." password="..."/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 2014-10-24
    • 1970-01-01
    • 2017-03-05
    • 2010-10-18
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    相关资源
    最近更新 更多