यदि प्रत्येक पंक्ति को एक अलग मान मिलना चाहिए जो डेटाबेस में मौजूदा डेटा से प्राप्त नहीं किया जा सकता है, तो समग्र जटिलता को अनुकूलित करने के लिए आप बहुत कुछ नहीं कर सकते हैं। इसलिए बहुत अधिक चमत्कारों की अपेक्षा न करें।
उस ने कहा, आपको तैयार बयानों और बैचिंग का उपयोग शुरू करना चाहिए:
public void updateRank(Map<Integer,Double> map){
Iterator<Entry<Integer, Double>> it = map.entrySet().iterator();
String query = "";
int i = 0;
Connection connection = getConnection(); // get the DB connection from somewhere
PreparedStatement stmt = connection.prepareStatement("update profile set rank = ? where profileId = ?");
while (it.hasNext()) {
Map.Entry<Integer,Double> pairs = (Map.Entry<Integer,Double>)it.next();
stmt.setInt(1, pairs.getValue());
stmt.setDouble(2, pairs.getKey());
stmt.addBatch(); // this will just collect the data values
it.remove();
}
stmt.executeBatch(); // this will actually execute the updates all in one
}
यह क्या करता है:
- तैयार कथन के कारण SQL पार्सर केवल एक बार SQL को पार्स करता है
- बैचिंग क्लाइंट-सर्वर-राउंडट्रिप्स को कम करता है ताकि हर अपडेट के लिए एक न हो
- क्लाइंट और सर्वर के बीच संचार कम से कम होता है क्योंकि SQL केवल एक बार प्रसारित होता है और डेटा एकत्र किया जाता है और एक पैकेट (या कम से कम पैकेट) के रूप में भेजा जाता है
इसके अलावा:
- कृपया जांचें कि क्या डेटाबेस कॉलम
profileId
एक अनुक्रमणिका का उपयोग कर रहा है ताकि संबंधित पंक्ति को देखना पर्याप्त तेज़ हो - आप जांच सकते हैं कि आपका कनेक्शन ऑटो-कमिट पर सेट है या नहीं। यदि ऐसा है तो ऑटो-प्रतिबद्धता को अक्षम करने का प्रयास करें और सभी पंक्तियों के अद्यतन होने के बाद स्पष्ट रूप से लेन-देन करें। इस तरह सिंगल अपडेट ऑपरेशन भी तेज हो सकते हैं।