Запрос postgres JDBC с тайм-аутом

К сожалению, setTimeout не реализован для JDBC/postgres. Есть ли способ смоделировать или обмануть это? Функционально я хочу выполнить запрос и затем разбить, если он занимает больше, чем N секунд

Ответ 1

"statement_timeout" выглядит так, как вы хотите.

SET statement_timeout TO 1000; -- for a second
<your_query_here>;
RESET statement_timeout; -- reset

Ответ 2

Один из способов - попробовать запустить запрос в классе Timer. Выбросьте исключение, если Таймер закончится без возвращаемого значения.

Hibernate и JDO поставьте такую ​​конструкцию. Возможно, они были бы хорошими альтернативами для вас.

Ответ 3

Что делать, если вы используете c3p0 для своего источника данных? Он имеет множество настраиваемых параметров, а также для запутанных баз данных и сетей, например, приобретаетRetryAttempts, приобретаетRetryDelay и breakAfterAcquireFailure.

Ответ 4

Использование ключевого слова LOCAL ограничивает область действия statement_timeout текущей транзакции. Таким образом, если что-то пойдет не так (например, время истекает), таймаут получит reset.

BEGIN TRANSACTION;
SET LOCAL statement_timeout TO 1000;    -- one-second timeout
SELECT COUNT(*) FROM really_huge_table; -- your slow query
ROLLBACK;                               -- reset