【问题标题】:Broken pipe with PostgreSQLPostgreSQL 损坏的管道
【发布时间】:2011-10-04 14:48:58
【问题描述】:

首先,在发布此问题之前,我已经阅读了与此错误相关的帖子。但是,他们中的大多数都没有使用 PostgreSQL,所以这个错误可能会以不同的方式处理。这是此错误的堆栈跟踪:

    WARN  org.hibernate.util.JDBCExceptionReporter  - SQL Error: 0, SQLState: 08006
 4450102501 [XmlBlaster.socket_ssl.cbWorkerThread] ERROR org.hibernate.util.JDBCExceptionReporter  - An I/O error occured while sending to the backend.
 java.lang.RuntimeException: org.hibernate.exception.JDBCConnectionException: could not execute query using iterate
    at edu.umd.cattlab.vatraffic.listener.output.VaTrafficDbModule.processSingleMessage(VaTrafficDbModule.java:380)
    at edu.umd.cattlab.vatraffic.listener.output.VaTrafficDbModule.processMessage(VaTrafficDbModule.java:266)
    at edu.umd.cattlab.vatraffic.listener.input.InputModule.sendMessageToOuputModules(InputModule.java:36)
    at edu.umd.cattlab.vatraffic.listener.input.XmlBlaster.update(XmlBlaster.java:173)
    at org.xmlBlaster.client.XmlBlasterAccess.update(XmlBlasterAccess.java:1043)
    at org.xmlBlaster.client.protocol.AbstractCallbackExtended.update(AbstractCallbackExtended.java:111)
    at org.xmlBlaster.client.protocol.AbstractCallbackExtended.update(AbstractCallbackExtended.java:199)
    at org.xmlBlaster.util.protocol.RequestReplyExecutor.receiveReply(RequestReplyExecutor.java:444)
    at org.xmlBlaster.client.protocol.socket.WorkerThread.run(WorkerThread.java:51)
 Caused by: org.hibernate.exception.JDBCConnectionException: could not execute query using iterate
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.loader.hql.QueryLoader.iterate(QueryLoader.java:427)
    at org.hibernate.hql.ast.QueryTranslatorImpl.iterate(QueryTranslatorImpl.java:380)
    at org.hibernate.engine.query.HQLQueryPlan.performIterate(HQLQueryPlan.java:224)
    at org.hibernate.impl.SessionImpl.iterate(SessionImpl.java:1192)
    at org.hibernate.impl.QueryImpl.iterate(QueryImpl.java:46)
    at edu.umd.cattlab.schema.hibernate.cattXML.extensions.VaTraffic.VaTrafficHelper.laneMap(VaTrafficHelper.java:165)
    at edu.umd.cattlab.vatraffic.listener.output.VaTrafficDbModule.processIncidentDescription(VaTrafficDbModule.java:396)
    at edu.umd.cattlab.vatraffic.listener.output.VaTrafficDbModule.processSingleMessage(VaTrafficDbModule.java:360)
    ... 8 more
 Caused by: org.postgresql.util.PSQLException: An I/O error occured while sending to the backend.
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:218)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
    at org.hibernate.loader.hql.QueryLoader.iterate(QueryLoader.java:404)
    ... 15 more
 Caused by: java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(Unknown Source)
    at java.net.SocketOutputStream.write(Unknown Source)
    at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
    at java.io.BufferedOutputStream.write(Unknown Source)
    at org.postgresql.core.PGStream.SendChar(PGStream.java:174)
    at org.postgresql.core.v3.QueryExecutorImpl.sendBind(QueryExecutorImpl.java:829)
    at org.postgresql.core.v3.QueryExecutorImpl.sendOneQuery(QueryExecutorImpl.java:1053)
    at org.postgresql.core.v3.QueryExecutorImpl.sendQueryPreamble(QueryExecutorImpl.java:373)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:189)

我们的应用程序使用 Hibernate,所以这里是 Hibernate 配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

  <session-factory>

    <!-- Database connection settings -->
    <property name="connection.driver_class">org.postgresql.Driver</property>
    <property name="connection.url">jdbc:postgresql://cannottell.umd.edu</property>
    <property name="connection.username"></property>
    <property name="connection.password"></property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

    <!-- Enable C3P0 database connection pool -->
    <!----> <!--<property name="c3p0.min_size">2</property>
    <property name="c3p0.max_size">5</property>
    <property name="c3p0.timeout">600</property>
    <property name="c3p0.max_statements">0</property>
    <property name="hibernate.c3p0.idle_test_period">300</property>
    <property name="hibernate.c3p0.acquire_increment">1</property>-->

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>

    <!-- Oracle doesn't handle prepared statement caching very well.  This disables prepared statements. -->
    <property name="statement_cache.size">0</property>

    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>

    <!-- Disable the second-level cache  -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">false</property>

    <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">false</property>

    <!-- ritis schema mappings -->
    <mapping resource="edu/umd/cattlab/schema/hibernate/cattXML/cattXML.hbm.xml"/>
    <mapping resource="edu/umd/cattlab/schema/hibernate/cattXML/cattXMLLookup.hbm.xml"/>

    <!-- vatraffic schema mappings -->
    <mapping resource="edu/umd/cattlab/schema/hibernate/cattXML/extensions/VaTraffic/vaTraffic.hbm.xml"/>
    <mapping resource="edu/umd/cattlab/schema/hibernate/cattXML/extensions/VaTraffic/vaTrafficLookup.hbm.xml"/>

</session-factory>

</hibernate-configuration>

这是我的问题:

  1. 这个错误真的来自与数据库的连接丢失,还是我的代码错误? (如果是后者,那我就提供相关代码)
  2. 无论如何,我应该如何处理这个错误?
  3. 如果错误来自数据库,如果我没有直接访问数据库的权限,我如何复制此错误(出于测试目的)?

如果我问的问题太多,我很抱歉。顺便说一句,如有必要,我很乐意添加有关此问题的更多信息。我非常感谢大家的任何回应。谢谢。

添加

下面是打开和关闭休眠会话的代码:

Session sess = HibernateUtil.getSessionFactory().openSession();

    Transaction tx = null;
    String eventId = null;

    try {

        sess.getTransaction().setTimeout(new Integer(configuration
                        .getProperty("messageProcessingTimeout")));

        if (!sess.isConnected()) {
            attemptReconnect();
        } else {
            log.debug("Database connection open.");
        }

        //tx = sess.beginTransaction();
        //log.debug("After transaction");
        eventId = processIncidentDescription(message, sess);

        //tx.commit();

        // Sending jmsNotify.
        if (Boolean.valueOf(configuration.getProperty("sendJmsNotify"))
                && eventId != null) {
            log.debug("Sending jmsNotify message " + "<notify id=\""
                    + eventId + "\"/>");
            jmsSender.sendMessage("<notify id=\"" + eventId + "\"/>");
        }
    } catch (Exception e) {

        try {
            if (tx != null)
                tx.rollback();
        } catch (TransactionException te) {
            log.warn("Unable to roll back transaction.");
        }

        throw new RuntimeException(e);
    } finally {
        sess.close();
    }

添加

这是可能导致错误的代码:

public static HashMap<String,HashMap<String,Object>> laneMap(Session sess){
    HashMap<String,HashMap<String,Object>> table = new HashMap<String,HashMap<String,Object>>();
    Query query = sess.createQuery("from Direction");
    Iterator<Object> iterate = query.iterate();
    while (iterate.hasNext()){
        Object obj = iterate.next();
        Direction direct = (Direction) obj;
        if (table.get("direction") == null){
            table.put("direction", new HashMap<String,Object>());
        }
        String directDesc = direct.getDirectionDescription();
        table.get("direction").put(directDesc, direct);
    }
    Query query2 = sess.createQuery("from LaneStatus");
    Iterator<Object> iterate2 = query2.iterate();
    while (iterate2.hasNext()){
        Object obj = iterate2.next();
        LaneStatus laneStatus = (LaneStatus) obj;
        if (table.get("lane_status") == null){
            table.put("lane_status", new HashMap<String,Object>());
        }
        String directDesc = laneStatus.getLaneStatusDescription();
        table.get("lane_status").put(directDesc, laneStatus);
    }
    Query query3 = sess.createQuery("from LaneType");
    Iterator<Object> iterate3 = query3.iterate();
    while (iterate3.hasNext()){
        Object obj = iterate3.next();
        LaneType laneType = (LaneType) obj;
        if (table.get("lane_type") == null){
            table.put("lane_type", new HashMap<String,Object>());
        }
        String directDesc = laneType.getLaneTypeDescription();
        table.get("lane_type").put(directDesc, laneType);
    }
    return table;
}

【问题讨论】:

  • 能否贴出相关的hibernate代码?
  • @danny.lesnik 具体是哪一个?
  • 当打开/关闭 Hibernate 会话和事务时。
  • 我在最新的编辑中添加了更多代码。

标签: java hibernate postgresql


【解决方案1】:

当您的应用程序无法再连接到 Postgres 数据库时,就会出现此问题。当我被 VPN 连接到我的办公室时,我已经发生了这种情况,然后关闭 VPN 连接,这会切断数据库连接。然后我的本地服务器将显示上述内容。如果您的服务器环境中出现此问题,您需要查看是否存在网络连接问题。

【讨论】:

  • 这是否意味着我无法控制那里发生的事情?我读过关于 MySQL 的 auto_connect 属性,以便在发生此类错误时可以重新连接。我不确定 postgres 是否具有相同的功能。
  • 你是如何连接的?如果您使用的是连接池,那么这个问题应该只在出现网络故障、数据库崩溃或类似情况时才会发生。
  • 好吧,我不认为数据库崩溃了。基本上我只需要用数据库重新启动应用程序就可以了。可能来自我的代码?
  • 很抱歉,不过我不太明白你的问题。我可以说的是连接不是由内部 Hibernate 池以外的其他池池化的。 (它也没有使用 c3p0,因为这个应用程序已经在生产服务器中)
  • 如果是这种情况,您可能需要检查可能切断 Postgres 连接的网络故障。当我在本地工作并且管道中断时,我需要做的就是重新启动,但显然这对于​​生产服务器来说是不可接受的。您可能还想查看服务器级别的连接池。
【解决方案2】:

您的应用尝试同时打开到 PostgreSQL 的连接数是否超过了 PG 实例中配置的最大并发连接数?

【讨论】:

  • 这会导致不同的错误信息(表明打开的连接太多)。
  • @Gandalf 这是有道理的,但是,正如 a_horse_with_no_name 指出的那样,那将是不同的错误。你有什么可以证明你的主张的吗?
猜你喜欢
  • 2010-10-28
  • 2011-03-19
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
相关资源
最近更新 更多