দ্বিতীয় উপায়টি একটি বাচ্চাটি আরও দক্ষ, তবে তাদের ব্যাচগুলিতে চালিত করার একটি আরও ভাল উপায়:
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();
}
}
তবে আপনি জেডিবিসি ড্রাইভার প্রয়োগের উপর নির্ভরশীল যে আপনি একবারে কতগুলি ব্যাচ চালাতে পারবেন। আপনি উদাহরণস্বরূপ প্রতি 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();
}
}
}
}
মাল্টিথ্রেডেড এনভায়রনমেন্টমেন্টগুলির হিসাবে, যদি আপনি একই পদ্ধতিতে ব্লকের অভ্যন্তরীণ সংক্ষিপ্ততম স্কোপটিতে সংযোগ এবং বিবৃতিটি জেডিবিসি আইডিয়োম অনুসারে -সংস্থান-সংস্থার বিবরণ ব্যবহার করে দেখিয়েছেন তবে এটি সম্পর্কে চিন্তা করার দরকার নেই in উপরে স্নিপেটস।
যদি এই ব্যাচগুলি লেনদেন হয়, তবে আপনি সংযোগটির স্বতঃসংশোধন বন্ধ করতে এবং সমস্ত ব্যাচ শেষ হয়ে গেলে কেবল লেনদেনের প্রতিশ্রুতিবদ্ধ করতে চান। অন্যথায় এটি কোনও নোংরা ডাটাবেসের ফলস্বরূপ হতে পারে যখন প্রথম ব্যাচের ব্যাচ সফল হয়েছিল এবং পরে না।
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
প্রতিটি পুনরাবৃত্তির জন্য একটি নতুন তৈরি করছেন (প্রথম কোড স্নিপেটে)? এটি করার কোনও কারণ আছে কি?