Запрос RX к базе упал
Ошибка NHibernate «could not execute query» в Directum RX: запрос к PostgreSQL завершился ошибкой. Настоящая причина во внутреннем исключении: таймаут, блокировка, отсутствующий столбец, нарушение ключа.
Что это значит
Directum RX работает с базой через NHibernate. Эта фраза только обёртка: база вернула ошибку на запрос. Что именно случилось, видно во внутреннем исключении PostgreSQL.
Частые варианты:
- 57014 canceling statement due to statement timeout: запрос шёл дольше разрешённого;
- 40P01 deadlock detected: взаимная блокировка;
- 42703 column … does not exist или 42P01 relation … does not exist: схема базы не совпадает с кодом, обычно после неполного обновления;
- 23503 … violates foreign key constraint: удаляют или меняют запись, на которую ссылаются другие.
Как проверить
- Код SQLSTATE и текст во внутреннем исключении.
- Сам запрос: он есть в логе рядом. По нему понятно, какая сущность и какой модуль.
- Если это таймаут, найти запрос в
pg_stat_statementsи посмотреть план.
Что сделать
- Таймауты: разобрать медленный запрос, чаще всего помогает индекс. Подсказки в статье о разборе «тормозит».
- Несовпадение схемы: довести обновление до конца, чтобы скрипты изменения базы и код были одной версии.
- Нарушение ключа: это логика прикладной разработки, передать разработчикам с текстом и данными.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать