Psqlexception error canceling statement due to statement timeout

PostgreSQL: ERROR – canceling statement due to statement timeout

This article is half-done without your Comment! *** Please share your thoughts via Comment ***

PostgreSQL Error like “canceling statement due to statement timeout” – I love this error message because the developer should know the tentative require total execution time of their queries or functions.

In a real-time application, we must analyze the average execution time for our queries so that System Admin or Database Admin can allocate resource workload appropriately.

I completely disagree with Developers for arguments like why we need to inform tentative execution time of our query?.

Because for example, today you execute your query and it took two mins so tomorrow, it might complete in around two mins only.

For this query, we can set timeout up to 5 mins, but if it is taking more than 5 mins, then the developer should check for that query.

So error like “canceling statement due to statement timeout” which helps a lot to identify this kind of long running query.

If your query starts to take more time, there are mainly two reasons:
1. Query is same, but the number of records increases in table
2. DBA forget to execute VACUUM ANALYZE or ANALYZE

So here my suggestion is, DBA can set a timeout value for mission critical query or we can also set threshold value so that we can check the status of a query before killing it.

Источник

Ошибка canceling statement due to statement timeout

Использую PGSQL. Есть таблица записей

1000 000 записей

При авторизации пользователя в аккаунт идет пересчет поля salary в целом по аккаунту для всех пользователей

Плохо разбираюсь в тебе блокировок в PGSQL, просьба подсказать как исправить ситуацию с точки зрения блокировок, в какую сторону смотреть?

Перемещено hobbit из general

Тебе дали изолированные транзакции. Нет не хочу, хочу жрать блокировки.

Зачем вообще нужно statement_timeout = ‘5000ms’ ? Оно даже на одинаковых объёмах данных в 100% случаев гарантированно не отрабоает.

Смысл такой, что если уже есть блокировка, то ждем 5 сек., если не дождались, то падаем с ошибкой

У нас кремниевой долине, для синхронизации данных в двух базах Кулибины родили следующий алгоритм: (1) сначала проверяется номер ревизии двух баз, если на приёмнике устаревшая ревизия, (2) начинается обновление до актуальной на основе базы-источника, (3) в конце сравниваются данные на идентичность.

Редко, но бывает случаются сбои в матрице, когда источник изменился на момент выполнения шага (2). Тогда происходит откат изменений и процесс просто запускается повторно. Задача с тем, что в ОП не один в один, но краеугольный камень в виде возможности словить обновление во время уже запущенного обновления присутствует.

Не фонтан, но возня с блокировками на мой, не обременённый большим опытом работы с БД взгляд, выглядит менее предсказуемо. Гарантий, что апдейт в принципе выполнится за n секунд нет.

Испытываю скудность в ассортименте предложений, кроме банального увеличения таймаута, ну и посмотреть план запроса на возможность оптимизации — как ещё извернуться в данной ситуации самому было бы интересно узнать.

общий запрос обновления по аккаунту (большой аккаунт) выполняется долго > 5 секунд

При авторизации пользователя в аккаунт идет пересчет поля salary в целом по аккаунту для всех пользователей

Не понял, ты что, всем пользователям проставляешь одинаковое значение salary?

Источник

Postgresql error: отмена заявления из-за запроса пользователя

Что вызывает эту ошибку в postgresql?

Мои версии программного обеспечения:

PostgreSQL 9.1.6 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2), 64-bit».

Мой драйвер postgresql: postgresql-9.2-1000.jdbc4.jar

Использование версии java: Java 1.7

Clue: моя база данных postgresql находится на твердотельном жестком диске, и эта ошибка происходит случайно, а иногда и вовсе.

ОТВЕТЫ

Ответ 1

Мы выяснили причину этой проблемы. Это объясняется ошибкой реализации setQueryTimeout() в последних драйверах JDBC 9.2-100x. Это может не произойти, если вы открываете/закрываете соединение вручную, но очень часто происходит с пулом соединений на месте, а autocommitfalse. В этом случае setQueryTimeout() следует вызывать с ненулевым значением (например, используя аннотацию Spring framework @Transactional (timeout = xxx)).

READ  Visual studio debug unhandled exception

Оказывается, всякий раз, когда исключение SQL возникает во время выполнения инструкции, таймер отмены не отменяется и остается в живых (как он реализован). Из-за объединения, соединение позади не закрыто, но возвращается в пул. Позже, когда таймер отмены срабатывает, он случайным образом отменяет запрос, связанный в настоящее время с соединением, с которым был создан этот таймер. В настоящий момент это совершенно другой запрос, который объясняет эффект случайности.

Предлагаемое обходное решение — отказаться от setQueryTimeout() и вместо этого использовать конфигурацию PostgreSQL (statement_timeout). Он не обеспечивает такой же уровень гибкости, но, по крайней мере, всегда работает.

Ответ 2

Если вы получаете эту ошибку без использования транзакций

Пользователь попросил отменить выражение. Заявление делает именно то, что ему говорят. Вопрос в том, кто просил это выражение быть отменено?

Посмотрите на каждую строку вашего кода, которая подготавливает SQL для выполнения. У вас может быть какой-то метод, применимый к утверждению, которое отменяет утверждение при некоторых обстоятельствах, например:

В моем случае, что случилось, я установил тайм-аут запроса на 25 секунд, и когда вставка заняла больше времени. Он передал исключение «отмена из-за исключения пользователя».

Если вы получаете эту ошибку при использовании транзакций:

Если вы получите это исключение, дважды проверьте весь свой код, который выполняет транзакции SQL.

Если у вас есть запрос, который находится в транзакции, и вы забываете совершить транзакцию, а затем используете это соединение, чтобы делать что-то еще, где вы работаете, как если бы вы не находились в транзакции, может быть поведение undefined, которое производит это исключение.

Убедитесь, что весь код, выполняющий транзакцию, очищается после себя. Убедитесь, что транзакция начинается, выполняются работы, выполняется больше работы, а транзакция откатывается или фиксируется, а затем убедитесь, что соединение осталось в состоянии autocommit=true .

Если это ваша проблема, тогда исключение не бросается туда, где вы забыли очистить себя, это происходит где-то долго после того, как вы не смогли очистить после транзакции, сделав это неуловимым исключением для отслеживания. Обновление соединения (закрытие и получение нового) очистит его.

Ответ 3

Это предполагает, что ошибка ошибки гонки в jarb jar файле для postgresql отвечает за указанную выше ошибку. (состояние гонки описано здесь: http://postgresql.1045698.n5.nabble.com/ERROR-canceling-query-due-to-user-request-td2077761.html)

Обходной путь 1, периодически обновлять соединение с базой данных

Один из способов — закрыть соединение с базой данных и периодически создавать новое подключение к базе данных. После того, как каждые несколько тысяч операторов sql просто закрывают соединение и воссоздают его. Затем по какой-то причине эта ошибка больше не выбрасывается.

Обходной путь 2, включите ведение журнала

Если вы включаете ведение журнала на уровне драйвера JDBC при настройке драйвера, то в некоторых ситуациях проблема состояния гонки нейтрализуется:

Обходной путь 3, поймать исключение и повторно инициализировать соединение

Вы также можете попробовать поймать конкретное исключение, повторно инициализировать соединение и повторить попытку запроса.

Обходной путь 4, дождитесь появления jQuery jgbc jgbc с исправлением ошибки

Я думаю, что проблема может быть связана со скоростью моего SSD-накопителя. Если вы получите эту ошибку, сообщите, как ее последовательно воспроизводить здесь, есть разработчики, очень заинтересованные в раздавливании этой ошибки.

Ответ 4

В дополнение к предложениям Эрика вы можете видеть, что оператор отменяет, когда:

  • Администратор или другое соединение, зарегистрированное как один и тот же пользователь, использует pg_cancel_backend , чтобы попросить ваш сеанс отменить его текущий оператор
  • Администратор отправляет сигнал на бэкэнд PostgreSQL, который запускает ваш оператор
  • Администратор запрашивает fast выключение или перезапуск сервера PostgreSQL

Проверьте задания cron или инструменты управления загрузкой, которые могут отменить длительные запросы.

Источник

ошибка postgresql: отмена инструкции из-за запроса пользователя

Что вызывает эту ошибку в postgresql?

Мои версии программного обеспечения:

PostgreSQL 9.1.6 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2), 64-bit».

Мой драйвер postgresql: postgresql-9.2-1000.jdbc4.jar

Используя версию java: Java 1.7

Подсказка: моя база данных postgresql находится на твердотельном жестком диске, и эта ошибка возникает случайно, а иногда и вовсе не происходит.

READ  Sqlite3 database error database is locked

Мы выяснили причину этой проблемы. Это объясняется ошибочной реализацией setQueryTimeout () в последних версиях драйверов JDBC 9.2-100x. Этого может не произойти, если вы открываете / закрываете соединение вручную, но очень часто случается, если установлен пул соединений и для параметра autocommit установлено значение false . В этом случае setQueryTimeout () следует вызывать с ненулевым значением (например, с использованием аннотации @Transactional (timeout = xxx) Spring framework).

Оказывается, всякий раз, когда во время выполнения оператора возникает исключение SQL, таймер отмены не отменяется и остается в рабочем состоянии (вот как это реализовано). Из-за объединения в пул последующее соединение не закрывается, а возвращается в пул. Позже, когда срабатывает таймер отмены, он случайным образом отменяет запрос, связанный в данный момент с подключением, с которым был создан этот таймер. На данный момент это совершенно другой запрос, который объясняет эффект случайности.

Предлагаемый обходной путь — отказаться от setQueryTimeout () и использовать вместо него конфигурацию PostgreSQL (statement_timeout). Он не обеспечивает такой же уровень гибкости, но, по крайней мере, всегда работает.

Это предполагает, что ошибка состояния гонки в файле jdbc jar для postgresql является причиной указанной выше ошибки.

Обходной путь 1. Периодически обновляйте соединение с базой данных.

Один из способов решения проблемы — закрыть соединение с базой данных и периодически создавать новое соединение с базой данных. После каждых нескольких тысяч операторов sql просто закройте соединение и создайте его заново. Потом почему то больше не выкидывается эта ошибка.

Обходной путь 2: включите ведение журнала

Если вы включите ведение журнала на уровне драйвера JDBC при настройке драйвера, то в некоторых ситуациях проблема состояния гонки нейтрализуется:

Обходной путь 3: перехватите исключение и повторно инициализируйте соединение

Вы также можете попробовать перехватить конкретное исключение, повторно инициализировать соединение и повторить запрос.

Обходной путь 4. Подождите, пока postgresql jdbc jar не выйдет с исправлением ошибки.

Думаю, проблема может быть связана со скоростью моего жесткого диска SSD. Если вы получили эту ошибку, опубликуйте, пожалуйста, здесь, как ее последовательно воспроизвести, есть разработчики, очень заинтересованные в устранении этой ошибки.

Если вы получаете эту ошибку без использования транзакций

Пользователь запросил отмену выписки. Заявление делает именно то, что ему велено. Спрашивается, кто просил отменить это заявление?

Посмотрите на каждую строчку своего кода, которая подготавливает SQL к выполнению. У вас может быть какой-то метод, который применяется к оператору, который отменяет оператор при некоторых обстоятельствах, например:

В моем случае произошло то, что я установил тайм-аут запроса на 25 секунд, и когда вставка заняла больше времени. Он передал исключение «Отмена запроса из-за запроса пользователя».

Если вы получаете эту ошибку при использовании транзакций:

Если вы получили это исключение, дважды проверьте весь свой код, выполняющий транзакции SQL.

Если у вас есть запрос, который находится в транзакции, и вы забыли выполнить фиксацию, а затем вы используете это соединение для чего-то еще, где вы работаете, как если бы вы не участвовали в транзакции, может возникнуть неопределенное поведение, которое создает это исключение.

Убедитесь, что весь код, выполняющий транзакцию, очищается после себя. Убедитесь, что транзакция началась, работа выполнена, выполнено больше работы и транзакция отменена или зафиксирована, затем убедитесь, что соединение осталось в этом autocommit=true состоянии.

Если это ваша проблема, то исключение не возникает там, где вы забыли очистить после себя, это происходит где-то спустя долгое время после того, как вы не смогли очистить после транзакции, что делает это неуловимым исключением для отслеживания. Обновление соединения (закрытие и получение нового) очистит его.

Источник

ошибка postgresql: отмена оператора из-за запроса пользователя

Что вызывает эту ошибку в postgresql?

Мои версии программного обеспечения:

PostgreSQL 9.1.6 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2), 64-bit».

Мой драйвер postgresql: postgresql-9.2-1000.jdbc4.jar

Использование версии Java: Java 1.7

Подсказка: моя база данных postgresql находится на твердотельном жестком диске, и эта ошибка возникает случайным образом, а иногда и вовсе.

Те же проблемы с PostgreSQL 9.2.1 (PostgreSQL 9.2.1 на x86_64-unknown-linux-gnu, скомпилированный gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52), 64-разрядная версия), с тем же JDK и драйвер postgresql-9.2-1001.jdbc4.jar. База данных находится на вращающемся диске, отмена операторов происходит случайным образом, приложение не отменяет никаких операторов SQL, а тайм-аут оператора установлен на 0 (неопределенный). Причина/решение пока не найдено. — reta

READ  Parsing error identifier react has already been declared

FYI: это все еще актуально для postgresql-42.2.2 JDBC-драйвер — Andremoniy

Возможно, у меня была эта проблема с драйвером JDBC postgresql-42.2.9 (но не уверен, возможно, это было что-то еще). У меня было странно, оно исчезло, когда я удалил предложение where и фильтрацию по полю даты. — combinatorist

Обновление драйвера JDBC postgresql-42.2.18 исправило это, когда я получал его с заданиями spark 2.4.4 scala 2.11 на AWS EMR 5.29. — combinatorist

4 ответы

Мы выяснили причину этой проблемы. Это объясняется глючной реализацией setQueryTimeout() в последних драйверах JDBC 9.2-100x. Этого может не произойти, если вы открываете/закрываете соединение вручную, но очень часто происходит с пулом соединений и автокоммит установлен в ложный. В этом случае setQueryTimeout() следует вызывать с ненулевым значением (например, с использованием аннотации Spring framework @Transactional(timeout = xxx)).

Оказывается, всякий раз, когда во время выполнения инструкции возникает исключение SQL, таймер отмены не был отменен и остается в живых (так это реализовано). Из-за объединения в пул соединение позади не закрывается, а возвращается в пул. Позже, когда срабатывает таймер отмены, он случайным образом отменяет запрос, связанный в настоящее время с соединением, для которого был создан этот таймер. На данный момент это совершенно другой запрос, который объясняет эффект случайности.

Предлагаемый обходной путь — отказаться от setQueryTimeout() и вместо этого использовать конфигурацию PostgreSQL (statement_timeout). Он не обеспечивает такой же уровень гибкости, но, по крайней мере, всегда работает.

Возможно, связанная проблема была исправлена ​​в версии 9.4.1205, интересно, связана ли она: github.com/pgjdbc/pgjdbc/issues/412 — Роджердпак

Это предполагает, что причиной вышеуказанной ошибки является ошибка состояния гонки в файле jdbc jar для postgresql.

Обходной путь 1, периодически обновлять соединение с базой данных

Одним из обходных путей является закрытие соединения с базой данных и периодическое создание нового соединения с базой данных. После каждых нескольких тысяч операторов sql просто закройте соединение и создайте его заново. Потом почему-то эта ошибка больше не вылетает.

Обходной путь 2, включите ведение журнала

Если включить ведение журнала на уровне драйвера JDBC при настройке драйвера, то в некоторых ситуациях проблема состояния гонки нейтрализуется:

Обходной путь 3, поймать исключение и повторно инициализировать соединение

Вы также можете попробовать поймать конкретное исключение, повторно инициализировать соединение и повторить запрос.

Обходной путь 4, подождите, пока postgresql jdbc jar не выйдет с исправлением ошибки

Я думаю, что проблема может быть связана со скоростью моего жесткого диска SSD. Если вы получаете эту ошибку, пожалуйста, опубликуйте здесь, как воспроизвести ее последовательно, есть разработчики, очень заинтересованные в устранении этой ошибки.

Если вы получаете эту ошибку без использования транзакций

Пользователь запросил отмену выписки. Заявление делает именно то, что ему говорят делать. Вопрос в том, кто просил отменить это заявление?

Посмотрите на каждую строку вашего кода, которая подготавливает SQL к выполнению. У вас может быть какой-то метод, который применяется к оператору, который отменяет оператор при некоторых обстоятельствах, например:

В моем случае произошло следующее: я установил время ожидания запроса на 25 секунд, а когда вставка заняла больше времени. Он прошел исключение «отмена заявления из-за запроса пользователя».

Если вы получаете эту ошибку при использовании транзакций:

Если вы получили это исключение, дважды проверьте весь код, выполняющий транзакции SQL.

Если у вас есть запрос, который находится в транзакции, и вы забыли зафиксировать, а затем используете это соединение для выполнения чего-то еще, где вы работаете, как если бы вы не были в транзакции, может быть неопределенное поведение, которое создает это исключение.

Убедитесь, что весь код, выполняющий транзакцию, убирает за собой. Убедитесь, что транзакция началась, работа выполнена, выполнена дополнительная работа и транзакция отменена или зафиксирована, а затем убедитесь, что соединение осталось в состоянии autocommit=true состоянии.

Если это ваша проблема, то исключение не выдается там, где вы забыли убрать за собой, это происходит где-то спустя долгое время после того, как вы не смогли очистить после транзакции, что делает это неуловимым исключением для отслеживания. Обновление соединения (закрытие и получение нового) очистит его.

Источник

Smartadm.ru