2012-08-28 36 views
5

मैं एक टेबल से कुछ मूल्य लाने के लिए स्प्रिंग नामांकित पैरामीटर जेडीबीसी टेम्पलेट का उपयोग कर रहा हूं। किसी कारण से, SQL प्रबंधन स्टूडियो पर एक ही क्वेरी चलाने के विरोध में क्वेरी मेरे जावा ऐप में बहुत धीमी गति से चलती है। मैंने प्रोफाइलर में भी ध्यान दिया, तैयार बयानों का पुन: उपयोग नहीं किया जाता है। यदि मैं अपने जावा एप्लिकेशन में कई बार एक ही क्वेरी चलाता हूं, तो मुझे विभिन्न तैयार कथन निष्पादित किए जाते हैं। तो, सुनिश्चित नहीं है कि बयानों का पुन: उपयोग क्यों नहीं किया जा रहा है। प्रदर्शन धीमा है क्योंकि मैं अपनी क्वेरी में एक आईएन क्लॉज का उपयोग कर रहा हूं?स्प्रिंग नामांकित पैरामीटर जेडीबीसीटीप्लेट तैयार राज्यों का पुन: उपयोग

यहाँ मेरी नमूना जावा कोड

StringBuilder vQuery = new StringBuilder(); 
vQuery.append(" SELECT SUM(Qty) FROM vDemand"); 
vQuery.append(" WHERE ProductID = :ProductID"); 
vQuery.append(" AND [Date] >= :StartDate AND [Date] <= :EndDate"); 
vQuery.append(" AND CustomerID IN (:CustomerID)"); 

MapSqlParameterSource vNamedParameters = new MapSqlParameterSource(); 
vNamedParameters.addValue("ProductID", aProductID); 
vNamedParameters.addValue("CustomerID", aCustomerlIDs); 
vNamedParameters.addValue("StartDate", aDate, Types.TIMESTAMP); 
vNamedParameters.addValue("EndDate", aDate, Types.TIMESTAMP); 

int vTotalQuantity = this.getNamedParameterJdbcTemplate().queryForInt(vQuery.toString(), vNamedParameters); 
return vTotalQuantity; 

उत्तर

9

वसंत के NamedParameterJdbcTemplate के स्रोत कोड को देखते हुए है, यह एक संरचना ParsedSql में अपने एसक्यूएल पार्स करता है, और फिर प्रश्न चिह्न के साथ अपने नाम वाले पैरामीटर को बदल देता है, तो बनाता है PreparedStatement और इसे अपने पैरामीटर से भरता है।

यह ParsedSql प्रविष्टियों को कैश करता है, लेकिन हमेशा नया PreparedStatements बनाता है इसलिए आखिरकार इन्हें जेडीबीसी ड्राइवर स्तर पर पुन: उपयोग नहीं किया जाता है।

  1. आप एसक्यूएल SQL क्वेरी के अंदर ही यह कर के बजाय तरीकों का उपयोग कर पैरामीटर जोड़ सकते हैं:

    एक PreparedStatement एक नियमित Statement पर दो फायदे हैं। इसके साथ आप एसक्यूएल इंजेक्शन हमलों से बचें और ड्राइवर को आपके लिए टाइप रूपांतरण करने दें।

  2. जैसा कि आपने कहा था, उसी PreparedStatement को विभिन्न पैरामीटर के साथ बुलाया जा सकता है, और डेटाबेस इंजन क्वेरी निष्पादन योजना का पुन: उपयोग कर सकता है।

ऐसा लगता है कि NamedParameterJdbcTemplate आपको पहले लाभ के साथ मदद करता है, लेकिन बाद के लिए कुछ भी नहीं करता है।

+0

धन्यवाद। अजीब चीज़ जो मैं देख रहा हूं वह एक प्रश्न के लिए भी है, रन टाइम एसक्यूएल सर्वर प्रबंधन स्टूडियो में रन टाइम की तुलना में लगभग 50 गुना अधिक है। मैं नामांकित पैरामीटर से छुटकारा पाने की कोशिश करूंगा और देख सकता हूं कि एक सीधा एसक्यूएल इस मुद्दे को हल करता है या नहीं। एक बार फिर धन्यवाद। – user320587

+2

मुझे लगता है कि यह एक अलग समस्या है, अपने जेडीबीसी ड्राइवर की कॉन्फ़िगरेशन की जांच करें। ड्राइवर के साथ एक नई परियोजना बनाएं और एक मुख्य विधि जो केवल क्वेरी निष्पादित करती है, सादा वर्ग। 50 गुना धीमा है। – Luciano