2012-05-03 46 views
7

Tình huống
Tôi có một ứng dụng web Java (Tomcat) bằng cách sử dụng jTDS để kết nối với cơ sở dữ liệu MSSQL 2008. Ứng dụng Java này thực hiện 99% các thủ tục lưu sẵn MSSQL của nó bằng cách sử dụng đầu vào của người dùng.jTDS + thủ tục lưu trữ + chuẩn bị lỗi = nesting =?

Vấn đề
Người tài xế jTDS trả lời đôi khi (ở những nơi khác nhau trong ứng dụng) với lỗi:

Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).

Chúng ta có thể tránh điều này bằng cách thêm prepareSQL=0 đến chuỗi kết nối jTDS. Sau đó, lỗi biến mất ở mọi nơi, nhưng với tất cả các giá trị khác của prepareSQL, lỗi vẫn tồn tại. Tôi không biết có bao nhiêu cấp độ làm tổ được lưu trữ jTDS bổ sung, nhưng dường như nó quá nhiều cho ứng dụng của chúng ta.

Câu hỏi

  1. Với thủ tục chỉ được lưu trữ để thực hiện, tất nhiên sử dụng chuẩn bị phát biểu trong mã Java, bao nhiêu tác dụng không prepareSQL=3 (hoặc prepareSQL=0) có cho chúng ta? Nói cách khác: trên mọi trang web tôi thấy mọi người nói "Không bao giờ sử dụng prepareSQL=0 trong môi trường sản xuất", điều đó cũng có thể áp dụng cho trường hợp này không?

  2. Nếu prepareSQL=0 không phải là giải pháp được đề xuất, vấn đề bảo mật, v.v., chúng tôi có thể nên tìm một trình điều khiển khác. jTDS chưa được cập nhật trong 2 năm qua và Microsoft có trình điều khiển cho JDBC 4.0. Tôi không thể tìm thấy bất kỳ điểm chuẩn hoặc so sánh giữa jTDS và trình điều khiển JDBC 4.0 của Microsoft mặc dù. Với các trình điều khiển 2.0 và 3.0 của Microsoft, ý kiến ​​chung dường như là jTDS nhanh hơn, tốt hơn, hiệu quả hơn. Đó có phải là trường hợp với JDBC 4.0 hay Microsoft đã vượt qua đối thủ cạnh tranh của nó trong điều này?

+0

Bạn đã quản lý để xác định hành vi này cho một số thủ tục cụ thể hoặc có vẻ như ngẫu nhiên? – heikkim

+0

Không, chúng tôi chưa có (chưa). Chúng tôi đã thấy lỗi này trong hai ứng dụng khác nhau của ứng dụng của chúng tôi tại hai địa điểm khác nhau trong ứng dụng, nhưng khi nó xảy ra, nó đã cứng đầu và chỉ có thể được giải quyết bằng cách sử dụng giải pháp chuẩn bị = 0. – bartlaarhoven

Trả lời

2

khi prepareSQL không bằng 0 jTDS thêm chính xác một mức trên làm tổ. Hãy xem xét theo thủ tục:

CREATE PROCEDURE F @v int 
AS 
BEGIN 
    select @v = @v - 1 
    IF @v = 0 SELECT @v 
    ELSE EXEC F @v 
END 

Và mã java mà sử dụng nó:

Connection connection = DriverManager.getConnection("jdbc:jtds:sqlserver://xxx.xxx.xxx.xxx:1433/xxx;prepareSQL=0"); 
PreparedStatement statement = connection.prepareStatement("EXEC F ?"); 
statement.setInt(1, 32); 
statement.execute(); 

Nếu bạn đặt prepareSQL để đánh giá khác hơn 0 nó sẽ thất bại với "thủ tục tối đa lưu trữ, chức năng, kích hoạt, hoặc xem làm tổ vượt quá giới hạn (giới hạn 32) ". Bạn cần phải tìm lý do tại sao mã của bạn sử dụng quá nhiều làm tổ? Bởi prepareSQL = 0 bạn đang ngăn chặn mssql sử dụng stamements và những người buộc phải phân tích SQL trên mỗi thực thi. Nó không phải là một vấn đề lớn nếu thời gian thực hiện tuyên bố là nhiều hơn rằng thời gian tuyên bố complation (E.G. nếu procedyre được lưu trữ thực hiện 10 giây nó không phải là một vấn đề nếu biên dịch mất 10ms hơn). Thay đổi trình điều khiển sẽ không giúp ích gì bởi vì bạn sẽ gặp phải vấn đề tương tự.

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