Spring JDBC ডেটাবেসে একাধিক রেকর্ড Batch Insert, Update, এবং Delete অপারেশনের জন্য কার্যকর টুল সরবরাহ করে। Batch Processing ডেটাবেস অপারেশনগুলিকে দ্রুত এবং কার্যকর করতে সাহায্য করে। Spring JDBC-তে JdbcTemplate এবং BatchPreparedStatementSetter ব্যবহার করে সহজেই এসব কাজ সম্পন্ন করা যায়।
Batch Insert
Batch Insert করার প্রয়োজনীয়তা
যখন একাধিক রেকর্ড ইনসার্ট করতে হয়, তখন একের পর এক ইনসার্ট করার বদলে Batch Insert ব্যবহার করলে পারফরম্যান্স উল্লেখযোগ্যভাবে উন্নত হয়।
উদাহরণ: Batch Insert
public void batchInsertUsers(List<User> users) {
String sql = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
User user = users.get(i);
ps.setInt(1, user.getId());
ps.setString(2, user.getName());
ps.setString(3, user.getEmail());
}
@Override
public int getBatchSize() {
return users.size();
}
});
}
কোড ব্যাখ্যা:
- SQL স্টেটমেন্ট: ইনসার্ট কুয়েরি।
- BatchPreparedStatementSetter:
setValues()মেথডে প্রতিটি রেকর্ডের জন্য প্যারামিটার সেট করা হয়।getBatchSize()মেথডে ব্যাচের আকার নির্ধারণ করা হয়।
- jdbcTemplate.batchUpdate(): ব্যাচ ইনসার্ট কার্যকর করে।
Batch Update
Batch Update করার প্রয়োজনীয়তা
একাধিক রেকর্ড আপডেট করার সময় Batch Update ব্যবহারে সময় এবং রিসোর্সের সাশ্রয় হয়।
উদাহরণ: Batch Update
public void batchUpdateEmails(List<User> users) {
String sql = "UPDATE users SET email = ? WHERE id = ?";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
User user = users.get(i);
ps.setString(1, user.getEmail());
ps.setInt(2, user.getId());
}
@Override
public int getBatchSize() {
return users.size();
}
});
}
কোড ব্যাখ্যা:
sql: আপডেট কুয়েরি।BatchPreparedStatementSetterপ্রতিটি রেকর্ডের জন্য প্যারামিটার সেট করে।jdbcTemplate.batchUpdate()ব্যাচ আপডেট সম্পন্ন করে।
Batch Delete
Batch Delete করার প্রয়োজনীয়তা
যখন একাধিক রেকর্ড মুছে ফেলতে হয়, তখন Batch Delete ব্যবহার করে একাধিক ডেটাবেস কল এড়ানো যায়।
উদাহরণ: Batch Delete
public void batchDeleteUsers(List<Integer> userIds) {
String sql = "DELETE FROM users WHERE id = ?";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setInt(1, userIds.get(i));
}
@Override
public int getBatchSize() {
return userIds.size();
}
});
}
কোড ব্যাখ্যা:
sql: ডিলিট কুয়েরি।BatchPreparedStatementSetterপ্রতিটি রেকর্ডের জন্যidপ্যারামিটার সেট করে।jdbcTemplate.batchUpdate()ব্যাচ ডিলিট সম্পন্ন করে।
ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে ব্যাচ অপারেশন
Java 8 এর ল্যাম্বডা ফিচার ব্যবহার করে ব্যাচ প্রসেস আরও কমপ্যাক্ট করা যায়।
Batch Insert with Lambda
public void batchInsertWithLambda(List<User> users) {
String sql = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";
jdbcTemplate.batchUpdate(sql, users, users.size(),
(ps, user) -> {
ps.setInt(1, user.getId());
ps.setString(2, user.getName());
ps.setString(3, user.getEmail());
}
);
}
Transaction Management সহ ব্যাচ প্রসেসিং
Batch অপারেশনের সময় ডেটা সঠিক রাখতে ট্রানজেকশন ব্যবহৃত হয়। Spring-এর @Transactional অ্যানোটেশন দিয়ে ট্রানজেকশন ম্যানেজ করা যায়।
Batch Processing with Transaction
@Service
@Transactional
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
public void batchInsertWithTransaction(List<User> users) {
String sql = "INSERT INTO users (id, name, email) VALUES (?, ?, ?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
User user = users.get(i);
ps.setInt(1, user.getId());
ps.setString(2, user.getName());
ps.setString(3, user.getEmail());
}
@Override
public int getBatchSize() {
return users.size();
}
});
}
}
Performance Tips
- Batch Size: ব্যাচ সাইজ (batch size) খুব বড় বা খুব ছোট হওয়া উচিত নয়। ৫০-১০০ রেকর্ড একটি ভালো সাইজ।
- Connection Pooling: ব্যাচ প্রসেসিংয়ে DataSource Connection Pooling ব্যবহার করলে পারফরম্যান্স উন্নত হয়।
- Transaction Management: বড় ব্যাচ অপারেশনের সময় ট্রানজেকশন ব্যবহার করুন।
- Indexed Columns: ব্যাচ আপডেট এবং ডিলিটের ক্ষেত্রে প্রয়োজনীয় কলামে ইনডেক্স নিশ্চিত করুন।
উপসংহার
Spring JDBC-তে Batch Insert, Update, এবং Delete ব্যবহার করলে ডেটাবেস অপারেশনের পারফরম্যান্স উল্লেখযোগ্যভাবে বৃদ্ধি পায়। এটি বড় আকারের ডেটা ম্যানিপুলেশনের জন্য অত্যন্ত কার্যকর। BatchPreparedStatementSetter এবং ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে কোড আরও সংক্ষিপ্ত এবং সহজ করা যায়।