2009-07-24 33 views
10

残念ながら、JDBC/postgresではsetTimeoutは実装されていません。私はこれをシミュレートしたり回避したりすることができますか?機能的に私は、クエリを実行すると、その後破るそれがN秒よりも長くかかる場合タイムアウトのあるJDBC postgresクエリ

+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が終了した場合は例外をスローします。

HibernateJDO供給そのような構築物。多分彼らはあなたのための良い選択肢になるでしょう。

+0

これはどのように実装されているか注意する必要があります。間違っていると、無視されているSQL接続を保持するブロックされたスレッドが多くなります。ここでの問題の一部は、何かをしている間にスレッドが例外をスローするよう強制することができないということです。 –

0

データソースにc3p0を使用するとどうなりますか?これには設定可能なオプションがたくさんあります。また、データベースやネットワークには、acquireRetryAttempts、acquireRetryDelay、breakAfterAcquireFailureなどがあります。 LOCALキーワードを使用して

0

は、現在のトランザクションにstatement_timeoutの範囲を制限します。そうすれば、何かがうまくいかない場合(タイムアウトなど)、タイムアウトがリセットされます。

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