স্প্রিং জেডিবিসি (Spring JDBC) এ Batch Processing হল একটি পদ্ধতি যার মাধ্যমে একাধিক SQL অপারেশন একসাথে (batch) এক্সিকিউট করা হয়। এতে করে ডেটাবেসের সাথে যোগাযোগের সংখ্যা কমানো যায়, যা কর্মক্ষমতা বাড়াতে সাহায্য করে, বিশেষত যখন একাধিক ইনসার্ট, আপডেট বা ডিলিট অপারেশন করা হয়।
স্প্রিং জেডিবিসি তে Batch Processing ব্যবহার করার জন্য প্রধানত JdbcTemplate
এর batchUpdate()
মেথড ব্যবহার করা হয়। এই মেথডটি একাধিক SQL স্টেটমেন্ট একবারে এক্সিকিউট করার জন্য ব্যবহৃত হয়।
ধরা যাক, আমরা একাধিক Employee
রেকর্ড ইনসার্ট করতে চাই। এজন্য batchUpdate()
মেথড ব্যবহার করা হবে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.sql.PreparedStatement;
import java.sql.SQLException;
@Component
public class EmployeeDao {
@Autowired
private JdbcTemplate jdbcTemplate;
// Method to add multiple employees in batch
public void addEmployeesBatch(final List<Employee> employees) {
String sql = "INSERT INTO Employee (id, name, salary) VALUES (?, ?, ?)";
// Using BatchPreparedStatementSetter to set batch parameters
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
Employee employee = employees.get(i);
ps.setInt(1, employee.getId());
ps.setString(2, employee.getName());
ps.setDouble(3, employee.getSalary());
}
@Override
public int getBatchSize() {
return employees.size();
}
});
}
}
ব্যাখ্যা:
batchUpdate()
মেথড ব্যবহার করা হয়েছে, যা BatchPreparedStatementSetter
এর মাধ্যমে ব্যাচ স্টেটমেন্ট গুলি সেট করে। প্রতিটি PreparedStatement
এর জন্য প্রয়োজনীয় মানগুলো (প্রতিটি Employee
এর তথ্য) সেট করা হয়।getBatchSize()
মেথডটি ব্যাচের আকার (যত গুলো রেকর্ড ইনসার্ট করা হবে) নির্ধারণ করে।আপনি যদি একাধিক Employee
এর তথ্য আপডেট করতে চান, তাহলে একইভাবে batchUpdate()
ব্যবহার করতে পারেন।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.sql.PreparedStatement;
import java.sql.SQLException;
@Component
public class EmployeeDao {
@Autowired
private JdbcTemplate jdbcTemplate;
// Method to update employee salaries in batch
public void updateSalariesBatch(final List<Employee> employees) {
String sql = "UPDATE Employee SET salary = ? WHERE id = ?";
// Using BatchPreparedStatementSetter to set batch parameters
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
Employee employee = employees.get(i);
ps.setDouble(1, employee.getSalary());
ps.setInt(2, employee.getId());
}
@Override
public int getBatchSize() {
return employees.size();
}
});
}
}
ব্যাখ্যা:
Employee
এর salary
আপডেট করা হচ্ছে। BatchPreparedStatementSetter
এর setValues()
মেথডে প্রতিটি রেকর্ডের তথ্য সেট করা হচ্ছে এবং getBatchSize()
মেথডে মোট রেকর্ড সংখ্যা নির্ধারণ করা হচ্ছে।এখন, একাধিক Employee
রেকর্ড ডিলিট করার জন্য ব্যাচ প্রক্রিয়া দেখানো হচ্ছে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.sql.PreparedStatement;
import java.sql.SQLException;
@Component
public class EmployeeDao {
@Autowired
private JdbcTemplate jdbcTemplate;
// Method to delete employees in batch
public void deleteEmployeesBatch(final List<Integer> employeeIds) {
String sql = "DELETE FROM Employee WHERE id = ?";
// Using BatchPreparedStatementSetter to set batch parameters
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setInt(1, employeeIds.get(i));
}
@Override
public int getBatchSize() {
return employeeIds.size();
}
});
}
}
ব্যাখ্যা:
DELETE
স্টেটমেন্ট ব্যবহার করা হয়েছে। employeeIds
এর একটি লিস্ট দেয়া হয়েছে, যেখানে প্রতিটি Employee
আইডি ডিলিট করার জন্য ব্যাচের মাধ্যমে পাঠানো হচ্ছে।স্প্রিং জেডিবিসি তে ব্যাচ প্রসেসিং ব্যবহার করলে একাধিক SQL অপারেশন একসাথে কার্যকরভাবে সম্পাদিত হয়, যার ফলে ডেটাবেসের সাথে যোগাযোগের সংখ্যা কমে এবং কর্মক্ষমতা বৃদ্ধি পায়। batchUpdate()
মেথডটি ব্যাচ অপারেশনগুলিকে পরিচালনা করার জন্য সহজ এবং কার্যকরী উপায় প্রদান করে।
Batch Processing হল একটি প্রযুক্তি যা একাধিক SQL কুয়েরি বা অপারেশন একসাথে (ব্যাচে) এক্সিকিউট করার প্রক্রিয়া। এটি মূলত পারফরম্যান্স উন্নত করার জন্য ব্যবহৃত হয়, বিশেষত যখন একাধিক ডেটাবেস অপারেশন একই সময়ে সম্পন্ন করতে হয়। Spring JDBC এ Batch Processing ব্যবহার করে একাধিক SQL অপারেশনকে একযোগে কার্যকর করা সম্ভব, যার ফলে ডেটাবেসে একাধিক অর্ডার ইনসার্ট, আপডেট, ডিলিট ইত্যাদি অপারেশন দ্রুত সম্পন্ন করা যায়।
Batch Processing হল এমন একটি পদ্ধতি যেখানে একাধিক SQL কুয়েরি বা ডেটাবেস অপারেশন একটি গ্রুপ হিসেবে (ব্যাচ) একসাথে রানের জন্য প্রস্তুত করা হয় এবং একবারে একাধিক অপারেশন সম্পন্ন করা হয়। সাধারণত, যখন আমাদের বড় পরিমাণ ডেটা ডেটাবেসে ইনসার্ট, আপডেট বা ডিলিট করতে হয়, তখন Batch Processing
ব্যবহার করা হয় যাতে প্রতিটি অপারেশনের জন্য ডেটাবেসে আলাদা আলাদা কুয়েরি চালানোর প্রয়োজন না হয়, এবং একসাথে কাজগুলো করা যায়।
Spring JDBC এ JdbcTemplate
এর মাধ্যমে Batch Processing সহজে করা যায়।
Spring JDBC তে JdbcTemplate
এর মাধ্যমে Batch Processing ব্যবহার করা হয়। এখানে batchUpdate
মেথড ব্যবহার করা হয়, যা একাধিক SQL কুয়েরি বা স্টেটমেন্ট একসাথে এক্সিকিউট করার সুবিধা দেয়।
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
public class BatchProcessingExample {
private JdbcTemplate jdbcTemplate;
public BatchProcessingExample(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public void addUsersBatch() {
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
// Batch data to insert
Object[][] users = {
{"John Doe", "john.doe@example.com"},
{"Jane Smith", "jane.smith@example.com"},
{"Robert Johnson", "robert.johnson@example.com"}
};
// Execute batch update
jdbcTemplate.batchUpdate(sql, users);
}
}
এখানে:
batchUpdate
মেথড ব্যবহার করে একাধিক INSERT
কুয়েরি একসাথে ডেটাবেসে এক্সিকিউট করা হচ্ছে।Object[][]
ব্যবহার করে একাধিক ইউজারের ডেটা অ্যারে আকারে জমা করা হয়েছে।Batch Processing এর মাধ্যমে পারফরম্যান্স, স্কেলেবিলিটি, এবং রিসোর্স ব্যবহারের দক্ষতা বৃদ্ধি পায়। এটি বিশেষভাবে গুরুত্বপূর্ণ যখন বড় পরিমাণ ডেটার সাথে কাজ করতে হয়, যেমন ডেটাবেসে একাধিক ইনসার্ট, আপডেট বা ডিলিট অপারেশন করা। Spring JDBC তে JdbcTemplate
এর batchUpdate
মেথড ব্যবহার করে সহজেই Batch Processing করা যায়।
Spring JDBC ডেটাবেসে একাধিক রেকর্ড Batch Insert, Update, এবং Delete অপারেশনের জন্য কার্যকর টুল সরবরাহ করে। Batch Processing ডেটাবেস অপারেশনগুলিকে দ্রুত এবং কার্যকর করতে সাহায্য করে। Spring JDBC-তে JdbcTemplate এবং BatchPreparedStatementSetter ব্যবহার করে সহজেই এসব কাজ সম্পন্ন করা যায়।
যখন একাধিক রেকর্ড ইনসার্ট করতে হয়, তখন একের পর এক ইনসার্ট করার বদলে 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();
}
});
}
কোড ব্যাখ্যা:
setValues()
মেথডে প্রতিটি রেকর্ডের জন্য প্যারামিটার সেট করা হয়।getBatchSize()
মেথডে ব্যাচের আকার নির্ধারণ করা হয়।একাধিক রেকর্ড আপডেট করার সময় 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 ব্যবহার করে একাধিক ডেটাবেস কল এড়ানো যায়।
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 এর ল্যাম্বডা ফিচার ব্যবহার করে ব্যাচ প্রসেস আরও কমপ্যাক্ট করা যায়।
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());
}
);
}
Batch অপারেশনের সময় ডেটা সঠিক রাখতে ট্রানজেকশন ব্যবহৃত হয়। Spring-এর @Transactional অ্যানোটেশন দিয়ে ট্রানজেকশন ম্যানেজ করা যায়।
@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();
}
});
}
}
Spring JDBC-তে Batch Insert, Update, এবং Delete ব্যবহার করলে ডেটাবেস অপারেশনের পারফরম্যান্স উল্লেখযোগ্যভাবে বৃদ্ধি পায়। এটি বড় আকারের ডেটা ম্যানিপুলেশনের জন্য অত্যন্ত কার্যকর। BatchPreparedStatementSetter
এবং ল্যাম্বডা এক্সপ্রেশন ব্যবহার করে কোড আরও সংক্ষিপ্ত এবং সহজ করা যায়।
Spring JDBC এ Batch Processing ব্যবহার করার মাধ্যমে একাধিক SQL অপারেশন (যেমন, ইনসার্ট, আপডেট, ডিলিট) একসাথে কার্যকর করা যায়। এতে করে ডেটাবেসের সাথে যোগাযোগের সংখ্যা কমে যায় এবং পারফর্মেন্স বৃদ্ধি পায়, বিশেষ করে যখন অনেক রেকর্ড একসাথে প্রক্রিয়া করতে হয়। নিচে উদাহরণ সহ ব্যাচ প্রোসেসিং ব্যবহার করার পদ্ধতি দেখানো হল।
ধরা যাক আমাদের একটি Employee
টেবিল রয়েছে, যেখানে কর্মীদের তথ্য ইনসার্ট করতে হবে। আমাদের উদ্দেশ্য হল একাধিক কর্মীকে একবারে ইনসার্ট করা।
application.properties
ফাইলে ডেটাবেস কনফিগারেশনপ্রথমে, application.properties
ফাইলে ডেটাবেস কনফিগারেশন করতে হবে:
# DataSource Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/your_database
spring.datasource.username=root
spring.datasource.password=root_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# Connection Pool Configuration (HikariCP)
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.connection-timeout=30000
# Hibernate Configuration (Optional)
spring.jpa.hibernate.ddl-auto=update
Employee
ক্লাস তৈরি করুন:এখানে একটি Employee
ক্লাস তৈরি করা হয়েছে, যা ডেটাবেস টেবিলের সাথে সম্পর্কিত:
public class Employee {
private int id;
private String name;
private double salary;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
এখন Spring JDBC এর JdbcTemplate
ব্যবহার করে ব্যাচ প্রক্রিয়া করব। এই উদাহরণে আমরা তিনটি কর্মীকে একসাথে ইনসার্ট করব।
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.List;
@Repository
public class EmployeeRepository {
private JdbcTemplate jdbcTemplate;
// Constructor injection for JdbcTemplate
public EmployeeRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void insertEmployeesBatch() {
String sql = "INSERT INTO employee (id, name, salary) VALUES (?, ?, ?)";
// Batch data to be inserted
List<Object[]> batchArgs = new ArrayList<>();
batchArgs.add(new Object[] {1, "John Doe", 50000});
batchArgs.add(new Object[] {2, "Jane Smith", 55000});
batchArgs.add(new Object[] {3, "James Bond", 60000});
// Perform batch update
jdbcTemplate.batchUpdate(sql, batchArgs);
}
}
insertEmployeesBatch()
মেথড কল করুন:এখন, EmployeeService
ক্লাসে এই ব্যাচ ইনসার্ট মেথডটি কল করা হবে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService {
private final EmployeeRepository employeeRepository;
@Autowired
public EmployeeService(EmployeeRepository employeeRepository) {
this.employeeRepository = employeeRepository;
}
public void batchInsertEmployees() {
employeeRepository.insertEmployeesBatch();
}
}
আপনি যদি এই ফাংশনালিটি ওয়েব ইন্টারফেসে ব্যবহার করতে চান, তবে Spring MVC Controller তৈরি করতে পারেন:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class EmployeeController {
private final EmployeeService employeeService;
@Autowired
public EmployeeController(EmployeeService employeeService) {
this.employeeService = employeeService;
}
@GetMapping("/insert-batch-employees")
public String insertBatchEmployees() {
employeeService.batchInsertEmployees();
return "Batch Insert Completed!";
}
}
এখন আপনি Spring Boot অ্যাপ্লিকেশনটি রান করতে পারেন এবং /insert-batch-employees
URL এ গিয়ে ব্যাচ ইনসার্ট পরীক্ষা করতে পারেন।
এভাবে Spring JDBC এর Batch Processing ব্যবহার করে আপনি ডেটাবেসে কার্যকরী এবং দক্ষভাবে ডেটা প্রক্রিয়া করতে পারেন।
Read more