简体   繁体   中英

Broken pipe with PostgreSQL

First of all, I already read posts relating to this error prior to posting this question. However, most of them are not using PostgreSQL, so this error might be handled differently. Here's the stack trace of this error:

    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)

Our application uses Hibernate, so here's the Hibernate configuration:

<?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>

Here's my questions:

  1. Is this error really comes from the lost connection to the database, or is it an error from my code? (If the latter is true, then I'll provide the codes involved)
  2. Either way, how should I deal with this error?
  3. If the error comes from the database, how can I replicate this error (for testing purpose), provided that I do not have direct access to the database?

I'm sorry if I'm asking too many questions.By the way, I would love to add more information regarding to this question if necessary. I really appreciate any response from you all. Thank you.

ADDED

Here's the code for opening and closing the hibernate session:

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();
    }

ADDED

Here's the code that might cause the error:

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;
}

This issue happens when your application can no longer connect to the Postgres DB. I've had it happen when I've been VPN'ed in to my office, and then close the VPN connection, which severs the DB connection. My local server will then show the above. If this issue is happening in your server environment, you need to see if there are network connectivity issues.

可能是您的应用尝试同时打开到PostgreSQL的连接数多于PG实例中允许的最大并发连接数吗?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM