2010-08-04 28 views
5

Tôi đang cố gắng sử dụng các câu lệnh chuẩn bị hoạt động trên cơ sở dữ liệu nằm khá xa, có độ trễ đáng kể và không đáng tin cậy liên quan đến kết nối mạng được sử dụng để truy cập cơ sở dữ liệu này. Thời gian ngừng hoạt động tối đa một phút là phổ biến. Vấn đề là trong trường hợp thất bại như vậy, nếu chương trình của tôi cố gắng thực thi bất kỳ câu lệnh đã chuẩn bị nào, toàn bộ luồng sẽ đi vào tình trạng chờ vô hạn. Nó không bao giờ lần ra ngoài và chỉ còn bị mắc kẹt, chờ đợi một phản ứng từ cơ sở dữ liệu.Đặt timeouts trên báo cáo đã chuẩn bị

Tôi đã thử sử dụng phương pháp setQueryTimeout() để đặt hết thời gian chờ thực thi, nhưng dường như có một số vấn đề với phương pháp này trong đó không thể hoạt động bình thường nếu mạng không thành công.

Có cách nào khác thay thế không?

+0

Có cách nào khác để giải quyết vấn đề này không, tôi không thực sự có ý định sử dụng Trình quản lý giao dịch, vì dường như quá mức cần thiết cho một thời gian chờ đơn giản – angryInsomniac

Trả lời

3

Theo hiểu biết của tôi, không có sự thay thế nào khác nếu bản thân mạng không thành công.

Chi tiết chính xác của setQueryTimeout liên quan đến trình điều khiển JDBC được hướng dẫn gửi tín hiệu Out Of Band (ít nhất là trong trường hợp của trình điều khiển JDBC Oracle) tới cơ sở dữ liệu để tạm dừng việc thực thi Tuyên bố đã chuẩn bị; phần này là quan trọng, vì nó phụ thuộc vào sự hỗ trợ được xây dựng trong trình điều khiển và cơ sở dữ liệu. Sau này, nó là tối đa cơ sở dữ liệu để lên lịch thực hiện hoạt động 'hủy' này; điều này có thể mất một lúc nếu mọi thứ phải được khôi phục hoặc nếu các giao dịch khác phải được thực thi, vv.

Với phần đầu tiên của bản thực hiện, rất khó có thể thực hiện "hết thời gian chờ" tính năng có thể được thiết lập. Bạn có thể muốn điều tra việc sử dụng một người quản lý giao dịch ở đây (JTA có lẽ), nhưng tôi không chắc chắn liệu sẽ gặp phải một tập hợp các trường hợp ngoại lệ kỳ lạ khác (nghĩ các ngoại lệ heuristic).

Phụ Lục

Sử dụng một màn hình chủ đề giám sát việc thực hiện các chủ đề khác và giết chết các chủ đề 'mắc kẹt' có thể là một ý tưởng tồi. This SO question sẽ giúp giải đáp tại sao một hoạt động như vậy nên tránh. Đây cũng là số tactic chosen by WebLogic Server.

+0

Có cách nào khác để giải quyết vấn đề này , tôi không thực sự có khuynh hướng sử dụng Trình quản lý giao dịch, vì dường như quá mức cần thiết cho một thời gian chờ đơn giản. – angryInsomniac

+0

Nếu cơ sở dữ liệu của bạn cho phép, hãy thiết lập giới hạn về lượng thời gian truy vấn có thể thực thi. Oracle DB cho phép điều này thông qua việc sử dụng các gói tài nguyên chỉ định giá trị của MAX_EST_EXEC_TIME - các truy vấn vượt quá giới hạn được chỉ định làm giá trị MAX_EST_EXEC_TIME. sẽ dẫn đến phiên Oracle bị giết. –

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