Postgresql 8.4 случайное зависание с доступом JDBC - PullRequest
11 голосов
/ 27 октября 2011

У меня очень интенсивно работает с базами данных приложение, которое работает много часов и использует несколько потоков, все общаются с Postgresql через JDBC. Симптом, который я вижу, состоит в том, что иногда (один-три раза из каждого «запуска») у меня возникает одно или несколько зависших соединений 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)

Я бы подумал о некоторой проблеме с блокировкой, за исключением того, что во многих случаях зависает только ОДИН поток. По крайней мере один из запросов, которые я видел в этом состоянии, был REINDEX, поэтому вполне возможно, что запрос занимает немало времени. В надежде найти решение я обновил драйвер JDBC с 8.4 до 9.1, но проблема все еще возникает. В журналах Postgresql нет ничего необычного. Любые идеи для дальнейшей диагностики (кроме использования pg_locks)?

1 Ответ

1 голос
/ 27 октября 2011

Существует очевидная вещь, которую вы можете попробовать: обновить сам PostgreSQL до версии 9.1.
Вы также можете регистрировать все долгосрочные операторы , которые могут дать вам подсказку.

Set log_min_duration_statement = 2000

Или любой другой порог, который вам подходит.
Я не знаю, как интерпретировать дамп потока, но эта строка выглядит странно:

  • заблокирован <0x2c023e10> (a org.postgresql.core.v3.QueryExecutorImpl)

Что заблокировано?И вы замечаете, как это неправильно написано "в org.postgresql.cor ...".Это артефакт копирования или вставки или оригинальное сообщение?Если это так, может помочь найти происхождение.

...