2009-07-24 9 views
10

불행히도 JDBC/postgres에는 setTimeout이 구현되지 않았습니다. 내가 시뮬레이트하거나 해결할 수있는 방법이 있습니까? 기능적으로 쿼리를 실행하고 나서 N 초보다 오래 걸리는 경우 휴식을 원합니다.제한 시간이있는 JDBC 포스트그레스 쿼리

+0

이 질문과 대답은 내가 만난 python/psycopg2 문제에도 유용합니다. Psycopg2는 연결 시간에 시간 초과 설정을 허용하는 것처럼 보이지만이 인터페이스는 필자의 경우에 추상화되었습니다. SO에서 검색하는 다른 사용자에게 도움이되도록이 댓글을 추가합니다. – SetJmp

답변

17

"statement_timeout"은 원하는대로 보입니다.

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

RESET statement_timeout을 사용하는 것이 더 낫습니다. 쿼리가 완료된 후 - 기본값이있는 경우 ... –

+0

지금 고쳐 주셔서 감사합니다! –

+0

pgAdmin3에서 이것을 테스트했습니다. SET statement_timeout이 실제 쿼리와 별도로 실행될 때만 작동합니다. 함께 실행되면 pgAdmin3은 이미 설정된 시간 제한 값을 사용하며 쿼리와 함께 제공된 시간 제한을 사용하지 않습니다. – Babar

1

한 가지 방법은 Timer 클래스에서 쿼리를 실행하는 것일 수 있습니다. 값을 돌려주지 않고 Timer가 종료하면 예외를 throw합니다.

HibernateJDO은 이러한 구조를 제공한다. 어쩌면 그들은 당신에게 좋은 대안이 될 것입니다.

+0

이것이 어떻게 구현되는지주의해야합니다. 잘못 수행되면 무시되는 SQL 연결이있는 많은 차단 스레드로 끝납니다. 여기서 문제의 일부는 스레드가 무언가를하는 도중에 예외를 throw하도록 강요 할 수 없다는 것입니다. –

0

데이터 소스로 c3p0을 사용한다면 어떻게 될까요? 구성 가능한 옵션이 많이 있으며 크랭키 한 데이터베이스와 네트워크 (예 : acquireRetryAttempts, acquireRetryDelay 및 breakAfterAcquireFailure)가 있습니다.

0

LOCAL 키워드를 사용하면 statement_timeout의 범위가 현재 트랜잭션으로 제한됩니다. 그렇게하면 시간 초과 등의 문제가 발생하면 재설정됩니다.

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