2009-03-17 5 views
7

Tôi có ứng dụng Java JDBC chạy trên cơ sở dữ liệu Oracle 10g. Tôi thiết lập một PreparedStatement để thực hiện một truy vấn, và sau đó gọi ps.executeQuery() để chạy nó. Thỉnh thoảng truy vấn mất một thời gian dài và tôi cần phải giết nó. Tôi có một truy cập thread khác mà đối tượng PreparedStatement, và gọi hủy bỏ() trên nó.Khi tôi gọi PreparedStatement.cancel() trong một ứng dụng JDBC, nó có thực sự giết nó trong một cơ sở dữ liệu Oracle không?

Câu hỏi của tôi là, điều này có thực sự giết truy vấn trong cơ sở dữ liệu không? Hay nó chỉ cắt đứt nó khỏi máy khách, và truy vấn vẫn đang chạy ở đâu đó trong ruột của Oracle?

Cảm ơn!

Trả lời

8

Câu trả lời là vấn đề về chất lượng thực hiện. Nếu bạn nhìn vào javadoc cho Statement.cancel(), nó nói nó sẽ xảy ra "nếu cả DBMS và trình điều khiển hỗ trợ hủy bỏ một câu lệnh SQL".

Theo kinh nghiệm của tôi với các phiên bản khác nhau của trình điều khiển Oracle JDBC, Statement.cancel() dường như làm những gì bạn muốn. Truy vấn dường như ngừng thực hiện ngay khi bị hủy.

+0

Không có trong trường hợp của tôi. https://stackoverflow.com/questions/44383579/how-do-i-forcibly-close-connections-from-a-connection-pool – supertonsky

1

Tùy thuộc vào trình điều khiển bạn đang sử dụng, cả trình điều khiển và cơ sở dữ liệu cần hỗ trợ hủy bỏ tuyên bố để nó hoạt động như bạn muốn. Oracle không hỗ trợ tính năng này, nhưng bạn cần biết thêm về trình điều khiển cụ thể mà bạn đang sử dụng để biết chắc chắn.

Ngoài ra, bạn có thể chạy thử nghiệm đơn giản bằng cách xem cơ sở dữ liệu sau khi bắt đầu và hủy truy vấn chạy dài.

10

Xin lưu ý rằng những gì tôi nói bên dưới dựa trên các quan sát và suy luận của Oracle đang sử dụng và không dựa trên bất kỳ sự hiểu biết sâu sắc nào về nội bộ của Oracle. Không ai trong số đó nên được coi là có thẩm quyền.

Điều ninesided được nói trong đoạn đầu tiên của họ là chính xác. Tuy nhiên, hãy cẩn thận thử nghiệm được đề xuất. Không phải tất cả các truy vấn oracle chạy dài đều giống nhau. Dường như các truy vấn được đánh giá qua hai giai đoạn, đầu tiên là một pha kết hợp đủ dữ liệu để biết cách trả về các hàng theo thứ tự đúng và thứ hai là một pha trả về các hàng lấp đầy khoảng trống mà nó không tính toán trong giai đoạn đầu tiên. Việc phân chia công việc giữa hai giai đoạn cũng bị ảnh hưởng bởi các thiết lập của trình tối ưu hóa dựa trên chi phí. ví dụ. Hàng đầu tiên so với Tất cả các hàng.

Bây giờ, nếu truy vấn nằm trong giai đoạn 1, yêu cầu hủy có vẻ tốt nhất để xếp hàng để được áp dụng vào cuối giai đoạn 1, có nghĩa là truy vấn vẫn tiếp tục hoạt động. Trong giai đoạn 2, các hàng được trả về trong các bó, và sau mỗi bó, lệnh hủy có thể có hiệu lực, vì vậy giả sử trình điều khiển hỗ trợ lệnh, yêu cầu hủy sẽ dẫn đến truy vấn bị giết. Quay trở lại đầu trang Thông số kỹ thuật cho lệnh hủy JDBC dường như không nói điều gì sẽ xảy ra nếu truy vấn không ngừng chạy, và do đó lệnh có thể chờ xác nhận việc giết, hoặc có thể hết thời gian chờ và quay trở lại với truy vấn vẫn đang chạy. Quay lại đầu trang ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||