2013-08-25 3 views
0

У меня есть программа Java, которая обеспечивает доступ к базе данных Postgres через JPA (EclipseLink).
Сначала я разрешил JPA создавать базу данных.
Затем я просматриваю java.sql.Connection (который я получаю от unraw() в менеджере сущностей) скрипт pgsql, который управляет созданной базой данных.
Менеджер сущности настроен на работу с пулом подключений (c3p0).
Часть скрипта отбрасывает ограничения на список таблиц.
По какой-то причине он застревает после того, как сбросил несколько таблиц.
Нет другой активной транзакции (pg_stat_activity), и нет никакой блокировки, которая не была предоставлена ​​(pg_locks).
Я добавил отладочную печать до и после инструкции ограничения на падение, и они оба напечатаны, поэтому кажется, что она застревает в середине цикла. При выборе из pg_stat_activity следующие результаты возвращаются для соответствующей операции:postgres plsql script loop get stuck

Waiting: false 
State: Active 
Query: Empty 

От проверить использование процессора и таких, кажется, процесс Postgres находится в режиме ожидания. Когда я запускаю скрипт из pgAdmin, он не застревает, только когда он запускается из программы Java. Обычно он застревает после 200 итераций цикла, но также застревает в других циклах. Проблема исчезла дважды после перезагрузки кода (true Vodou).
Меня больше интересуют инструменты анализа Postgres для таких сценариев. Любые идеи или техника для решения этого тупика будут оценены.

  • Обходной путь, который решил проблему, заключался в том, чтобы открыть новое соединение jdbc и запустить его оттуда, но мне все же интересно понять, как решать такие проблемы в будущем.
+0

Если вы используете Linux, пытались ли вы запустить 'strace -p ' из процесса, который застрял? Вы можете увидеть pid, запросив «pg_stat_activity». Кроме того, каково значение столбца «состояние» запроса в 'pg_stat_activity'? – bma

+0

Я добавил недостающую информацию к вопросу. Благодарю. @bma –

+0

Если на самом деле нет запросов на блокировку, и в db ничего не происходит, завершите процесс. Вот полезный учебник: http://www.hokstad.com/5-simple-ways-to-troubleshoot-using-strace – bma

ответ

1

Это не проблема Postgresql, а проблема JDBC или C3P0, если PGAdmin работает, но ваш метод JDBC этого не делает. Запрашиваете ли вы все запросы пула соединений C3P0, чтобы проверить, есть ли какие-либо проблемы на уровне db? Тот факт, что PGAdmin преуспевает, заставляет меня поверить, что вы должны пересмотреть свои конфигурации JDBC и C3P0 для любых проблем.

Подробнее о дб блокировке можно найти на следующих страницах:

0

Кажется, проблема была, что сценарий PLSQL использовали рейз уведомление для печати отладочные сообщения.
По какой-то причине, когда слишком много напечатано, скрипт застрял. Как только они были удалены, он снова начал работать.