2011-10-26 13 views
11

Tengo una aplicación muy intensiva en base de datos que se ejecuta durante muchas horas y utiliza varios hilos, todos hablando con Postgresql a través de JDBC. El síntoma que estoy viendo es que de vez en cuando (de una a tres veces por cada "ejecución") termino con una o más conexiones JDBC atascadas, que parecen estar esperando una respuesta de la base de datos pero parecen estar esperando por siempre. El vertedero de hilo es el siguiente:Postgresql 8.4 colgar ocasionalmente con acceso JDBC

"Thread-4367355" daemon prio=6 tid=0x04920c00 nid=0x1e88 runnable [0x04bef000] 
    java.lang.Thread.State: RUNNABLE 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:129) 
    at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:135) 
    at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:104) 
    at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:73) 
    at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:255) 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1165) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:191) 
    - locked <0x2c023e10> (a org.postgresql.core.v3.QueryExecutorImpl) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:452) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:337) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:329) 

yo hubiera pensado en algún tipo de bloqueo problema excepto que muchas veces sólo se está atascado. Al menos una de las consultas que he visto en este estado era un REINDEX, por lo que es posible que la consulta lleve bastante tiempo. Con la esperanza de encontrar una solución, actualicé el controlador JDBC de 8.4 a 9.1, pero el problema aún ocurre. No hay nada inusual en los registros Postgresql tampoco. ¿Alguna idea para más diagnósticos (aparte de usar pg_locks)?

+0

¿Pudo resolver el problema? Estamos frente a la misma 'suspensión' también en 9.1 –

+0

Estoy experimentando el mismo problema, Postgresql 8.4, controlador JDBC 9.1. La consulta es una eliminación compleja. El proceso en el servidor comienza a usar el 100% de la CPU y de repente cae al 0% y permanece en 0% para siempre. El hilo del cliente sobresale justo como el de arriba. – BrunoJCM

+0

NB que si se cuelga y dice "BLOQUEADO esperando el objeto XXX" puede significar que su conexión postgres está intentando ser utilizada por múltiples hilos [no es el caso en esta instancia, por supuesto, solo como una nota] – rogerdpack

Respuesta

1

Hay algo obvio que podrías intentar: actualizar PostgreSQL a la versión 9.1 también.
También puede registrar todos long running statements, que pueden darle una pista.

Set log_min_duration_statement = 2000 

O el umbral que sea adecuado para usted.
No sé cómo interpretar el volcado de hilo, pero esta línea parece peculiar:

  • encerrados < 0x2c023e10> (un org.postgresql.core.v3.QueryExecutorImpl)

¿Qué está bloqueado? Y nota cómo se escribe mal "en una org.postgresql.cor ...". ¿Es eso un artefacto de copiar y pegar o el mensaje original? Si es así, podría ayudar a encontrar el origen.

+1

bloqueado <0x2c023e10> significa el método ha adquirido un bloqueo que es un objeto org.postgresql.core.v3.QueryExecutorImpl. Y el hexadecimal es la dirección de la cerradura? – crybird

Cuestiones relacionadas