#postgresql #jdbc #freeze
#postgresql #jdbc #зависание
Вопрос:
У меня есть приложение с очень интенсивным использованием базы данных, которое работает в течение многих часов и использует несколько потоков, и все они взаимодействуют с 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)
Я бы подумал о какой-то проблеме с блокировкой, за исключением того, что часто зависает только ОДИН поток. По крайней мере, один из запросов, которые я видел в этом состоянии, был ПЕРЕИНДЕКСИРОВАН, поэтому возможно, что запрос занимает довольно много времени. В надежде найти решение я обновил драйвер JDBC с 8.4 до 9.1, но проблема все еще возникает. В журналах Postgresql также нет ничего необычного. Есть идеи для дальнейшей диагностики (кроме использования pg_locks)?
Комментарии:
1. Удалось ли вам решить проблему? Мы сталкиваемся с тем же «зависанием» и в 9.1
2. Я сталкиваюсь с той же проблемой, Postgresql 8.4, драйвер JDBC 9.1. Запрос представляет собой сложное удаление. Процесс на сервере начинает использовать 100% процессора, затем внезапно падает до 0% и остается на 0% навсегда. Клиентский поток зависает точно так же, как указано выше.
3. ПРИМЕЧАНИЕ: если он зависает и говорит «ЗАБЛОКИРОВАНО в ожидании объекта XXX», это может означать, что ваше соединение postgres пытается использоваться несколькими потоками [в данном случае, конечно, не так, просто в качестве примечания]
Ответ №1:
Есть очевидная вещь, которую вы могли бы попробовать: обновить сам PostgreSQL до версии 9.1.
Вы также можете регистрировать все долго выполняющиеся инструкции, которые могут дать вам подсказку.
Set log_min_duration_statement = 2000
Или любой другой порог, который вам подходит.
Я не знаю, как интерпретировать дамп потока, но эта строка выглядит странно:
- заблокировано <0x2c023e10> (a org.postgresql.core.v3.QueryExecutorImpl)
Что заблокировано? И вы заметили, как он неправильно пишет «в org.postgresql.cor …». Это артефакт копирования-вставки или исходное сообщение? Если это так, может помочь найти источник.
Комментарии:
1. заблокированный<0x2c023e10> означает, что метод получил блокировку, которая является объектом org.postgresql.core.v3.QueryExecutorImpl. А шестнадцатеричный — это адрес блокировки?