2012-05-03 17 views
7

स्थिति
मेरे पास एक एमएसएसक्यूएल 2008 डेटाबेस से कनेक्ट करने के लिए जेटीडीएस का उपयोग कर एक (टॉमकैट) जावा वेब एप्लिकेशन है। यह जावा एप्लिकेशन उपयोगकर्ता इनपुट का उपयोग कर 99% एमएसएसक्यूएल संग्रहीत प्रक्रियाओं को निष्पादित करता है।जेटीडीएस + संग्रहित प्रक्रियाएं + readySQL = घोंसला स्तर त्रुटि?

समस्या
jTDS चालक कभी कभी उत्तर त्रुटि के साथ (आवेदन में विभिन्न स्थानों पर):

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

हम jTDS कनेक्शन स्ट्रिंग को prepareSQL=0 जोड़कर इस से बच सकते हैं। फिर त्रुटि हर जगह चली जाती है, लेकिन prepareSQL के सभी अन्य मूल्यों के साथ, त्रुटि रहता है। मुझे नहीं पता कि जेटीडीएस के नेस्टिंग स्तर कितने संग्रहीत प्रक्रिया को जोड़ते हैं, लेकिन स्पष्ट रूप से यह हमारे आवेदन के लिए बहुत अधिक है।

प्रश्न

  1. केवल संग्रहित प्रक्रियाओं पर अमल करने के साथ

    , जावा कोड में तैयार बयान का उपयोग कर निश्चित रूप से, कितना प्रभाव prepareSQL=3 (या prepareSQL=0) हमारे लिए है? दूसरे शब्दों में: हर वेबसाइट पर मुझे लगता है कि "कभी भी उत्पादन वातावरण में prepareSQL=0 का उपयोग न करें", यह भी इस स्थिति पर लागू होता है?

  2. यदि prepareSQL=0 एक अनुशंसित समाधान, सुरक्षा समस्या इत्यादि नहीं है, तो हमें शायद एक और ड्राइवर की तलाश करनी चाहिए। जेटीडीएस को पिछले 2 वर्षों में अपडेट नहीं किया गया है और माइक्रोसॉफ्ट के पास जेडीबीसी 4.0 के लिए एक ड्राइवर है। मुझे जेटीडीएस और माइक्रोसॉफ्ट के जेडीबीसी 4.0 ड्राइवर के बीच कोई बेंचमार्क या तुलना नहीं मिल रही है। माइक्रोसॉफ्ट के 2.0 और 3.0 ड्राइवरों के साथ, सामान्य राय यह प्रतीत होती है कि जेटीडीएस तेज, बेहतर, अधिक कुशल है। क्या यह अभी भी जेडीबीसी 4.0 के साथ मामला है या माइक्रोसॉफ्ट ने इसके प्रतिद्वंद्वी को पास कर दिया है?

+0

क्या आपने इस व्यवहार को कुछ विशिष्ट प्रक्रिया में इंगित करने में कामयाब रहे हैं या यह यादृच्छिक प्रतीत होता है? – heikkim

+0

नहीं, हमने (अभी तक) नहीं किया है। हमने इस त्रुटि को एप्लिकेशन में दो अलग-अलग स्थानों पर हमारे आवेदन के दो अलग-अलग कार्यान्वयन में देखा है, लेकिन जब यह हुआ, तो यह जिद्दी था और केवल readySQL = 0 समाधान का उपयोग करके हल किया जा सकता था। – bartlaarhoven

उत्तर

2

जब prepareSQL 0 jTDS के बराबर नहीं है घोंसले पर बिल्कुल एक स्तर जोड़ें। पर विचार करें प्रक्रिया का पालन करें:

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

और जावा कोड है कि यह का उपयोग करें:

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(); 

आप 0 के अलावा अन्य मूल्य prepareSQL सेट करते हैं यह "के साथ अधिकतम संग्रहीत प्रक्रिया, समारोह, ट्रिगर या दृश्य नेस्टिंग असफल हो जायेगी स्तर पार हो गया (सीमा 32) "। आपको यह पता लगाना होगा कि आपका कोड इतना घोंसला क्यों उपयोग करता है? ReadySQL = 0 द्वारा आप mssql को स्टैमेमेंट्स का उपयोग करने के लिए रोक रहे हैं और जो प्रत्येक निष्पादन पर SQL को पार्स करने के लिए मजबूर हैं। अगर कथन निष्पादन का समय कथन निष्पादन का समय अधिक है तो यह एक बड़ी समस्या नहीं है (ईजी। अगर संग्रहीत प्रोसेडीर 10 सेकेंड को निष्पादित करता है तो संकलन 10 एमएमएस अधिक होने पर कोई समस्या नहीं है)। बदलते ड्राइवर मदद नहीं करेंगे क्योंकि आपके पास एक ही समस्या होगी।

संबंधित मुद्दे