К сожалению, setTimeout не реализован для JDBC/postgres. Есть ли способ смоделировать или обмануть это? Функционально я хочу выполнить запрос и затем разбить, если он занимает больше, чем N секунд
Запрос postgres JDBC с тайм-аутом
Ответ 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