बैच निष्पादक का उपयोग करना अनुशंसित तरीका है, लेकिन आपको इसे ठीक से करने की आवश्यकता है।
दो मुद्दे जिन पर मैंने ध्यान दिया।
- उचित बैच आकार निर्धारित करना महत्वपूर्ण है। लिंक किया गया उत्तर अंत में सभी डेटा भेजता है जो बहुत अधिक कुशल नहीं है।
${}
का उपयोग करना संदर्भ मापदंडों के लिए प्रत्येक कथन अद्वितीय बनाता है और ड्राइवर को कथन का पुन:उपयोग करने से रोकता है (मूल रूप से बैच निष्पादक का लाभ खो जाता है)। देखें यह अक्सर पूछे जाने वाले प्रश्न ए>#{}
. के बीच अंतर के लिए और${}
।
यहाँ MyBatis का उपयोग करते हुए एक विशिष्ट बैच ऑपरेशन दिया गया है।
सर्वश्रेष्ठ batchSize
के रूप में विभिन्न कारकों पर निर्भर करता है, आपको वास्तविक डेटा का उपयोग करके प्रदर्शन को मापना चाहिए।
int batchSize = 1000;
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
YourMapper mapper = sqlSession.getMapper(YourMapper.class);
int size = list.size();
for (int i = 0; i < size;) {
mapper.update(list.get(i));
i++;
if (i % batchSize == 0 || i == size) {
sqlSession.flushStatements();
sqlSession.clearCache();
}
}
sqlSession.commit();
}
और यहाँ अद्यतन विवरण का एक कुशल संस्करण है।
<update id="update">
UPDATE <include refid="tableName" />
SET
item_price = #{item.price},
update_time = #{item.updateTime}
WHERE id = #{item.id}
</update>