2011-10-26 21 views
11

Ho un'applicazione molto alta intensità di dati che si estende per molte ore e utilizza più thread, tutti a parlare di PostgreSQL tramite JDBC. Il sintomo che sto vedendo è che occasionalmente (da una a tre volte di ogni "esecuzione") finisco con una o più connessioni JDBC bloccate, che sembrano essere in attesa di una risposta dal database ma sembrano aspettarsi per sempre. La discarica filo è la seguente:PostgreSQL 8.4 occasionali appendere con accesso 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) 

avrei pensato di una sorta di bloccaggio problema, tranne che molte volte un solo thread è bloccato. Almeno una delle query che ho visto in questo stato era un REINDEX, quindi è possibile che la query richieda un bel po 'di tempo. Nella speranza di trovare una soluzione, ho aggiornato il driver JDBC da 8.4 a 9.1 ma il problema si verifica ancora. Niente di insolito nei registri di Postgresql. Qualche idea per ulteriori diagnosi (oltre all'uso di pg_locks)?

+0

siete riusciti a risolvere il problema? Siamo di fronte allo stesso 'blocco' anche su 9.1 –

+0

Sto vivendo lo stesso problema, Postgresql 8.4, driver JDBC 9.1. La query è una cancellazione complessa. Il processo sul server inizia a utilizzare il 100% della CPU, quindi scende improvvisamente allo 0% e rimane nello 0% per sempre. Il thread del client si blocca come sopra. – BrunoJCM

+0

NB che se si blocca e dice "bloccato in attesa per oggetto XXX" che può significare la vostra connessione Postgres sta tentando di essere utilizzato da più thread [non è il caso in questo caso, naturalmente, proprio come una nota] – rogerdpack

risposta

1

V'è la cosa più ovvia che si potrebbe provare: per aggiornare PostgreSQL stesso alla versione 9.1, anche.
si potrebbe anche registrare tutte le long running statements, che potrebbe dare un indizio.

Set log_min_duration_statement = 2000 

O qualunque soglia vi si addice.
Non so come interpretare la discarica thread, ma questa linea sembra singolare:

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

Cosa è bloccato? E tu noti come si scrive male "in un org.postgresql.cor ...". È un artefatto di copia-incolla o il messaggio originale? Se è così, potrebbe aiutare a trovare l'origine.

+1

bloccato <0x2c023e10> significa il metodo ha acquisito un blocco che è un oggetto org.postgresql.core.v3.QueryExecutorImpl. E l'esadecimale è l'indirizzo della serratura? – crybird

Problemi correlati