2009-07-24 38 views
10

Thật không may setTimeout không được triển khai cho JDBC/postgres. Có cách nào tôi có thể mô phỏng hoặc giải quyết vấn đề này không? Chức năng tôi muốn thực hiện truy vấn và sau đó ngắt nếu mất nhiều hơn N giâyTruy vấn postgres JDBC với thời gian chờ

+0

Tôi tìm thấy câu hỏi và câu trả lời này cũng hữu ích cho vấn đề python/psycopg2 mà tôi gặp phải. Psycopg2 dường như đã cho phép cài đặt thời gian chờ vào thời gian kết nối, nhưng giao diện này đã bị trừu tượng trong trường hợp của tôi. Thêm nhận xét này để mang lại lợi ích cho những người khác đang tìm kiếm trên SO. – SetJmp

Trả lời

17

"statement_timeout" trông giống như những gì bạn muốn.

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

Bạn nên sử dụng RESET statement_timeout; sau khi truy vấn đã hoàn tất - trong trường hợp có giá trị mặc định ... –

+0

Đã sửa lỗi, cảm ơn! –

+0

Đã kiểm tra điều này trên pgAdmin3. Chỉ làm việc khi SET statement_timeout được thực hiện riêng biệt với truy vấn thực tế. Khi được thực hiện cùng nhau, pgAdmin3 sử dụng bất kỳ giá trị thời gian chờ nào đã được đặt và không sử dụng giá trị được cung cấp cùng với truy vấn. – Babar

1

Một cách có thể là thử chạy truy vấn trong một lớp Timer. Ném ngoại lệ nếu Bộ hẹn giờ kết thúc mà không trả về giá trị.

HibernateJDO cung cấp cấu trúc như vậy. Có lẽ họ sẽ là lựa chọn thay thế tốt cho bạn.

+0

Bạn phải cẩn thận cách thực hiện điều này; nếu thực hiện sai, bạn kết thúc với nhiều chủ đề bị chặn đang nắm giữ các kết nối SQL mà chỉ bị bỏ qua. Một phần của vấn đề ở đây là bạn không thể buộc một chủ đề để ném một ngoại lệ nếu nó ở giữa làm một cái gì đó. –

0

Nếu bạn sử dụng c3p0 cho nguồn dữ liệu của bạn thì sao? Nó có rất nhiều tùy chọn cấu hình, và cho các cơ sở dữ liệu và mạng dữ dội, ví dụ, obtainRetryAttempts, obtainRetryDelay và breakAfterAcquireFailure.

0

Sử dụng từ khóa LOCAL giới hạn phạm vi của statement_timeout đối với giao dịch hiện tại. Bằng cách đó, nếu có gì sai (ví dụ: nó hết thời gian chờ) thì thời gian chờ được đặt lại.

BEGIN TRANSACTION; 
SET LOCAL statement_timeout TO 1000; -- one-second timeout 
SELECT COUNT(*) FROM really_huge_table; -- your slow query 
ROLLBACK;        -- reset 
Các vấn đề liên quan