2013-08-02 65 views
6

Tôi đang sử dụng PostgreSQL 8.3 và viết chương trình bằng C++ sử dụng API libpq. Tôi thực thi các lệnh một cách không đồng bộ với hàm PQsendQuery(). Tôi đang cố gắng triển khai tính năng xử lý thời gian chờ. Tôi đã thực hiện nó bằng cách gọi số PQcancel() khi hết thời gian chờ. Tôi đã thử nghiệm nó với truy vấn trả về 100 000 hàng (nó kéo dài khoảng 0,5 giây) với thời gian chờ là 1 ms và thấy rằng thay vì hủy lệnh, PQcancel() khối cho đến khi máy chủ kết thúc thực hiện, sau đó trả về bằng truy vấn thành công.PostgreSQL: hủy truy vấn từ chương trình C/C++

Tôi hiểu rằng tài liệu nói rằng ngay cả khi yêu cầu hủy thành công, truy vấn vẫn có thể được thực thi. Vấn đề của tôi là PQcancel() chặn luồng thực thi của tôi, không chấp nhận được vì tôi sử dụng xử lý không đồng bộ (sử dụng khung Asio Boost) để chương trình của tôi có thể thực hiện các tác vụ khác ngoài thực hiện truy vấn SQL, chỉ chạy trên một luồng .

Có bình thường là PQcancel() khối không? Có cách nào để thực hiện yêu cầu hủy không chặn không?

+2

Lưu ý phụ: Phiên bản 8.3 không được hỗ trợ. Cân nhắc việc cập nhật lên một trong các phiên bản được hỗ trợ. –

+0

Đây là phiên bản được phân phối bởi bản phân phối Linux mà tôi sử dụng (SUSE 11). – petersohn

+1

Nó không quan trọng làm thế nào nó được vận chuyển. Nó vẫn còn lỗi thời. –

Trả lời

2

Tôi đã xem xét triển khai PQcancel. Nó tạo ra một kết nối TCP riêng cho máy chủ, đó là lý do tại sao nó đang chặn. Phần mã này hoàn toàn giống với phiên bản mới nhất của PostgreSQL. Vì vậy, tôi kết luận rằng không có cách nào để làm cho nó không bị chặn khác hơn là bắt đầu hủy bỏ trong một chủ đề riêng biệt. Đây cũng là cách ưa thích của việc sử dụng tính năng này, vì đối tượng hủy hoàn toàn độc lập với đối tượng kết nối do đó nó hoàn toàn là chủ đề an toàn để sử dụng.

0

Có vẻ như bạn đang thực hiện việc này trên kết nối chặn. Kiểm tra tài liệu cho PQsetnonblocking, thiết lập kết nối để không chặn và bạn sẽ có thể nhận được PQCancel để trở về ngay lập tức. Nhưng nó cũng sẽ làm cho tất cả các hoạt động trên kết nối không bị chặn.

Các vấn đề liên quan