दूसरा तरीका अधिक कुशल है, लेकिन एक बेहतर तरीका यह है कि उन्हें बैचों में निष्पादित किया जाए:
public void executeBatch(List<Entity> entities) throws SQLException {
try (
Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement(SQL);
) {
for (Entity entity : entities) {
statement.setObject(1, entity.getSomeProperty());
// ...
statement.addBatch();
}
statement.executeBatch();
}
}
हालाँकि आप JDBC ड्राइवर कार्यान्वयन पर निर्भर हैं कि आप एक साथ कितने बैचों को निष्पादित कर सकते हैं। उदाहरण के लिए आप उन्हें हर 1000 बैचों को निष्पादित करना चाहते हैं:
public void executeBatch(List<Entity> entities) throws SQLException {
try (
Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement(SQL);
) {
int i = 0;
for (Entity entity : entities) {
statement.setObject(1, entity.getSomeProperty());
// ...
statement.addBatch();
i++;
if (i % 1000 == 0 || i == entities.size()) {
statement.executeBatch(); // Execute every 1000 items.
}
}
}
}
मल्टीथ्रेडेड वातावरण के रूप में, आपको इस बारे में चिंता करने की ज़रूरत नहीं है यदि आप कनेक्शन को प्राप्त करते हैं और बंद करते हैं और सामान्य जेडीबीसी मुहावरे के अनुसार उसी विधि ब्लॉक के अंदर कम से कम संभव दायरे में स्टेटमेंट के साथ-साथ संसाधनों के स्टेटमेंट का उपयोग करके दिखाया गया है स्निपेट के ऊपर।
यदि वे बैच ट्रांजेक्शनल हैं, तो आप कनेक्शन का स्वतः पूर्ण बंद करना चाहेंगे और सभी बैच समाप्त होने पर ही लेनदेन करें। अन्यथा यह एक गंदे डेटाबेस में हो सकता है जब बैचों का पहला गुच्छा सफल हुआ और बाद में नहीं।
public void executeBatch(List<Entity> entities) throws SQLException {
try (Connection connection = dataSource.getConnection()) {
connection.setAutoCommit(false);
try (PreparedStatement statement = connection.prepareStatement(SQL)) {
// ...
try {
connection.commit();
} catch (SQLException e) {
connection.rollback();
throw e;
}
}
}
}
sql
लूप में नहीं बदलती है? यदि वह क्वेरी लूप के प्रत्येक पुनरावृत्ति के लिए नहीं बदल रही है, तो आपPreparedStatement
प्रत्येक पुनरावृत्ति (पहले कोड स्निप में) के लिए एक नया क्यों बना रहे हैं ? क्या ऐसा करने का कोई कारण है?