आपको बैच इंसर्ट का उपयोग करना होगा।
- कस्टम रिपॉजिटरी के लिए एक इंटरफ़ेस बनाएं
SomeRepositoryCustom
public interface SomeRepositoryCustom {
void batchSave(List<Record> records);
}
SomeRepositoryCustom
. का कार्यान्वयन बनाएं
@Repository
class SomesRepositoryCustomImpl implements SomeRepositoryCustom {
private JdbcTemplate template;
@Autowired
public SomesRepositoryCustomImpl(JdbcTemplate template) {
this.template = template;
}
@Override
public void batchSave(List<Record> records) {
final String sql = "INSERT INTO RECORDS(column_a, column_b) VALUES (?, ?)";
template.execute(sql, (PreparedStatementCallback<Void>) ps -> {
for (Record record : records) {
ps.setString(1, record.getA());
ps.setString(2, record.getB());
ps.addBatch();
}
ps.executeBatch();
return null;
});
}
}
- अपना
JpaRepository
बढ़ाएंSomeRepositoryCustom
. के साथ
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom {
}
बचाने के लिए
someRepository.batchSave(records);
नोट
ध्यान रखें कि, यदि आप बैच इंसर्ट का भी उपयोग कर रहे हैं, तो डेटाबेस ड्राइवर उनका उपयोग नहीं करेगा। उदाहरण के लिए, MySQL के लिए, एक पैरामीटर जोड़ना आवश्यक है rewriteBatchedStatements=true
डेटाबेस URL के लिए। सब कुछ सत्यापित करने के लिए ड्राइवर SQL लॉगिंग (हाइबरनेट नहीं) को सक्षम करने के लिए बेहतर है। ड्राइवर कोड डीबग करने के लिए भी उपयोगी हो सकता है।
आपको लूप में पैकेट द्वारा रिकॉर्ड को विभाजित करने के बारे में निर्णय लेने की आवश्यकता होगी
for (Record record : records) {
}
एक ड्राइवर आपके लिए यह कर सकता है, इसलिए आपको इसकी आवश्यकता नहीं होगी। लेकिन इस चीज़ को भी डीबग करना बेहतर है।
अनुलेख var
. का उपयोग न करें हर जगह।