2011-10-26 15 views
11

Mam bardzo intensywną bazę danych, która działa przez wiele godzin i używa wielu wątków, wszystkie rozmawiają z PostgreSQL za pośrednictwem JDBC. Objawem, który widzę, jest to, że sporadycznie (jeden do trzech razy na każdy "bieg") kończę z jednym lub więcej zablokowanymi połączeniami JDBC, które wydają się czekać na odpowiedź z bazy danych, ale wydają się czekać na zawsze. Zrzut wątek jest w następujący sposób:Postgresql 8.4 okazjonalne zawieszenie z dostępem 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) 

bym myślał o jakimś blokowania problem z tym, że wiele razy tylko jeden wątek jest zablokowany. Przynajmniej jedno z zapytań, które widziałem w tym stanie, to REINDEX, więc możliwe jest, że zapytanie zajmuje sporo czasu. W nadziei na znalezienie rozwiązania zaktualizowałem sterownik JDBC z wersji 8.4 na 9.1, ale problem nadal występuje. Nie ma nic niezwykłego w dziennikach PostgreSQL. Jakieś pomysły na dalszą diagnostykę (inną niż używanie pg_locks)?

+0

Czy udało Ci się rozwiązać problem? Mamy do czynienia z tym samym "zawiesić się" również na 9.1 –

+0

Mam ten sam problem, Postgresql 8.4, sterownik JDBC 9.1. Zapytanie to złożone usunięcie. Proces na serwerze zaczyna wykorzystywać 100% procesora, a następnie nagle spada do 0% i pozostaje na zawsze w 0%. Nić klienta działa tak jak powyżej. – BrunoJCM

+0

Pamiętaj, że jeśli zawiesza się i mówi "ZABLOKOWANE oczekiwanie na obiekt XXX", co może oznaczać, że twoje połączenie postgresem próbuje zostać użyte przez wiele wątków [nie w tym przypadku oczywiście, tak jak w notatce] – rogerdpack

Odpowiedz

1

Jest rzeczą oczywistą, że można spróbować: zaktualizować samą wersję PostgreSQL do wersji 9.1.
Można również zalogować wszystkie long running statements, które mogą dać ci wskazówkę.

Set log_min_duration_statement = 2000 

Albo jakikolwiek próg ci odpowiada.
nie wiem jak interpretować zrzutu wątku, ale ta linia wygląda osobliwe:

  • zablokowana < 0x2c023e10> (a org.postgresql.core.v3.QueryExecutorImpl)

Co jest zablokowane? I zauważysz, jak błędnie literuje "w org.postgresql.cor ...". Czy to jest artefakt kopiuj-wklej lub oryginalna wiadomość? Jeśli tak, może pomóc w ustaleniu pochodzenia.

+1

zablokowane <0x2c023e10> oznacza metodę uzyskał blokadę będącą obiektem org.postgresql.core.v3.QueryExecutorImpl. A szesnastkowy to adres zamka? – crybird

Powiązane problemy