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
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ặcprepareSQL=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ụngprepareSQL=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?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?
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
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