- मैं का उपयोग कर एक काम विरासत कोड बदलने के लिए इस सवाल का जवाब सब का पालन किया Statement
(लेकिन एसक्यूएल इंजेक्शन वाले) एक समाधान करने के लिए का उपयोग कर PreparedStatement
के आसपास अर्थ विज्ञान के गरीब समझ की वजह से एक बहुत धीमी कोड के साथ Statement.addBatch(String sql)
औरPreparedStatement.addBatch()
।
इसलिए मैं अपने परिदृश्य को यहां सूचीबद्ध कर रहा हूं, ताकि अन्य लोग एक ही गलती न करें।
मेरा परिदृश्य था
Statement statement = connection.createStatement();
for (Object object : objectList) {
//Create a query which would be different for each object
// Add this query to statement for batch using - statement.addBatch(query);
}
statement.executeBatch();
इसलिए उपरोक्त कोड में, मेरे पास हजारों अलग-अलग प्रश्न थे, सभी ने एक ही बयान में जोड़ा और इस कोड ने तेजी से काम किया क्योंकि कैश नहीं होने वाले बयान अच्छे थे और इस कोड को ऐप में शायद ही कभी निष्पादित किया गया था।
SQL इंजेक्शन को ठीक करने के लिए, मैंने इस कोड को बदल दिया है
List<PreparedStatement> pStatements = new ArrayList<>();
for (Object object : objectList) {
//Create a query which would be different for each object
PreparedStatement pStatement =connection.prepareStatement(query);
// This query can't be added to batch because its a different query so I used list.
//Set parameter to pStatement using object
pStatements.add(pStatement);
}// Object loop
// In place of statement.executeBatch(); , I had to loop around the list & execute each update separately
for (PreparedStatement ps : pStatements) {
ps.executeUpdate();
}
तो आप देखते हैं, मैंने हजारों PreparedStatement
ऑब्जेक्ट बनाना शुरू कर दिया है और फिर अंततः बैचिंग का उपयोग करने में सक्षम नहीं है क्योंकि मेरे परिदृश्य ने मांग की है कि - हजारों अपडेट या इन्सर्ट प्रश्न हैं और इनमें से सभी प्रश्न अलग-अलग होते हैं।
प्रदर्शन में गिरावट के बिना किसी भी कीमत पर SQL इंजेक्शन को ठीक करना अनिवार्य था और मुझे नहीं लगता कि यह PreparedStatement
इस परिदृश्य में संभव है।
इसके अलावा, जब आप इनबिल्ट बैचिंग सुविधा का उपयोग करते हैं, तो आपको केवल एक स्टेटमेंट बंद करने के बारे में चिंता करनी होगी, लेकिन इस सूची दृष्टिकोण के साथ, आपको पुन : उपयोग करने से पहले स्टेटमेंट को बंद करने की आवश्यकता है, एक पुन: तैयार करना