Spring ORM এর মাধ্যমে Batch Processing জাভা অ্যাপ্লিকেশন থেকে ডেটাবেসে একাধিক অপারেশন কার্যকরভাবে পরিচালনা করার একটি প্রক্রিয়া। এটি একাধিক রেকর্ড একত্রে প্রক্রিয়া করতে এবং ডেটাবেস অপারেশনের কার্যকারিতা উন্নত করতে ব্যবহৃত হয়।
Batch Processing এর মাধ্যমে একাধিক ডেটাবেস অপারেশন একসঙ্গে এক্সিকিউট করা হয়। এটি সাধারণত Insert, Update বা Delete এর মতো পুনরাবৃত্তিমূলক কাজের জন্য ব্যবহৃত হয়। Hibernate এবং JPA ব্যবহার করে Spring ORM এ Batch Processing সহজেই ইমপ্লিমেন্ট করা যায়।
Hibernate এ Batch Processing সক্রিয় করতে hibernate.jdbc.batch_size
কনফিগার করতে হয়।
application.properties
ফাইলে নিম্নলিখিত প্রোপার্টি যুক্ত করুন:
spring.jpa.properties.hibernate.jdbc.batch_size=20
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
hibernate.jdbc.batch_size
: প্রতিটি ব্যাচে কতগুলো অপারেশন চালানো হবে।hibernate.order_inserts
: ব্যাচ ইনসার্ট অপারেশনকে গোষ্ঠীভুক্ত করে।hibernate.order_updates
: ব্যাচ আপডেট অপারেশনকে গোষ্ঠীভুক্ত করে।Batch Processing এর জন্য EntityManager
ব্যবহার একটি সাধারণ পদ্ধতি।
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.transaction.Transactional;
import org.springframework.stereotype.Repository;
@Repository
public class BatchProcessingRepository {
@PersistenceContext
private EntityManager entityManager;
@Transactional
public void saveUsersInBatch(List<User> users) {
int batchSize = 20; // Hibernate batch size
for (int i = 0; i < users.size(); i++) {
entityManager.persist(users.get(i));
if (i % batchSize == 0 && i > 0) {
entityManager.flush();
entityManager.clear();
}
}
}
}
persist
: একাধিক Entity ডেটাবেসে ইনসার্ট করে।flush
: Hibernate এর Persistence Context ডেটাবেসে লিখে।clear
: Persistence Context পরিষ্কার করে পরবর্তী ব্যাচের জন্য।Spring Data JPA এর মাধ্যমে saveAll()
মেথড ব্যবহার করে ব্যাচ ইনসার্ট করা যায়।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public void saveUsersInBatch(List<User> users) {
userRepository.saveAll(users);
}
}
Spring Data JPA এর saveAll()
মেথড Hibernate এর Batch Processing অপ্টিমাইজেশনের সাথে কাজ করে।
Hibernate এ Batch Fetching ব্যবহার করে Lazy Initialization এর কার্যকারিতা বাড়ানো যায়।
application.properties
কনফিগারেশন:spring.jpa.properties.hibernate.default_batch_fetch_size=10
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Order> orders;
// Getters and Setters
}
default_batch_fetch_size
Lazy Fetch এর সময় ডেটাবেস থেকে নির্দিষ্ট সংখ্যক রেকর্ড একত্রে নিয়ে আসে।
Spring ORM এবং Hibernate ব্যবহার করে Batch Processing ইমপ্লিমেন্ট করা অ্যাপ্লিকেশনের ডেটাবেস অপারেশনের কার্যক্ষমতা উল্লেখযোগ্যভাবে বাড়ায়। hibernate.jdbc.batch_size
এবং flush()/clear()
এর মতো মেকানিজম ব্যবহার করে ডেটাবেস রাউন্ড-ট্রিপ কমানো যায় এবং ডেটাবেস সংক্রান্ত অপারেশনের পারফরম্যান্স উন্নত করা যায়।
Batch Processing হলো একটি প্রক্রিয়া যেখানে একসঙ্গে একাধিক ডাটাবেজ অপারেশন সম্পন্ন করা হয়। এটি সাধারণত বড় পরিমাণ ডেটা আপডেট, ইন্সার্ট বা ডিলিট করার জন্য ব্যবহার করা হয়। Hibernate বা Spring ORM এ Batch Processing করে ডাটাবেজ অপারেশনগুলো আরও কার্যকর এবং দ্রুত সম্পন্ন করা যায়।
প্রত্যেকটি অপারেশনের জন্য আলাদা সংযোগ না খুলে একবারে একাধিক অপারেশন চালিয়ে ডাটাবেজ লোড কমানো হয়।
একাধিক অপারেশন একত্রে প্রক্রিয়া করায় ডাটাবেজ এবং অ্যাপ্লিকেশনের মধ্যে কম সংখ্যক রিকোয়েস্ট পাঠানো হয়।
বড় ডেটা সেট নিয়ে কাজ করার সময় Batch Processing ডাটাবেসের কার্যকারিতা এবং মেমোরি ব্যবহারে সহায়তা করে।
একসঙ্গে একাধিক অপারেশন একটি ট্রানজেকশনে সম্পন্ন হওয়ায় ডেটা কনসিস্টেন্সি বজায় রাখা সহজ হয়।
Hibernate এ Batch Insert করার জন্য hibernate.jdbc.batch_size প্রোপার্টি কনফিগার করতে হবে।
hibernate.cfg.xml
<property name="hibernate.jdbc.batch_size">20</property>
EmployeeDAO.java
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class EmployeeDAO {
@Autowired
private SessionFactory sessionFactory;
public void saveEmployeesInBatch(List<Employee> employees) {
Session session = sessionFactory.openSession();
session.beginTransaction();
int batchSize = 20; // Batch size
for (int i = 0; i < employees.size(); i++) {
session.save(employees.get(i));
if (i % batchSize == 0) {
session.flush(); // Flush changes to the database
session.clear(); // Clear session cache
}
}
session.getTransaction().commit();
session.close();
}
}
Spring এর JdbcTemplate ব্যবহার করে Batch Processing করা যায়।
EmployeeDAO.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class EmployeeDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
public void batchUpdateEmployees(List<Employee> employees) {
String sql = "INSERT INTO Employee (id, name, department) VALUES (?, ?, ?)";
jdbcTemplate.batchUpdate(sql, employees, 20, (ps, employee) -> {
ps.setInt(1, employee.getId());
ps.setString(2, employee.getName());
ps.setString(3, employee.getDepartment());
});
}
}
Hibernate এর মাধ্যমে Batch Delete অপারেশন করা যায়।
EmployeeDAO.java
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class EmployeeDAO {
@Autowired
private SessionFactory sessionFactory;
public void deleteEmployeesInBatch(List<Integer> employeeIds) {
Session session = sessionFactory.openSession();
session.beginTransaction();
String hql = "DELETE FROM Employee WHERE id = :id";
for (int i = 0; i < employeeIds.size(); i++) {
session.createQuery(hql)
.setParameter("id", employeeIds.get(i))
.executeUpdate();
if (i % 20 == 0) { // Batch size
session.flush();
session.clear();
}
}
session.getTransaction().commit();
session.close();
}
}
Hibernate এবং Spring ORM এর মাধ্যমে Batch Processing সহজেই বাস্তবায়ন করা যায়, যা বড় অ্যাপ্লিকেশন বা ডেটা-ইনটেনসিভ প্রসেসের জন্য অপরিহার্য।
Hibernate বা JPA এর মাধ্যমে Batch Insert এবং Update পরিচালনা করলে ডাটাবেজে একাধিক রেকর্ড সংযোজন বা আপডেট করার পারফরম্যান্স উল্লেখযোগ্যভাবে বৃদ্ধি পায়। এটি বিশেষভাবে কার্যকর হয় বড় ডেটাসেট নিয়ে কাজ করার সময়।
Spring ORM এবং Hibernate ব্যবহার করতে প্রয়োজনীয় ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
Hibernate এর কনফিগারেশনে Batch Processing সক্রিয় করতে নিচের প্রপার্টি যুক্ত করতে হবে:
hibernate.jdbc.batch_size=20
hibernate.order_inserts=true
hibernate.order_updates=true
hibernate.jdbc.batch_versioned_data=true
@Bean
public LocalSessionFactoryBean sessionFactory(DataSource dataSource) {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setPackagesToScan("com.example.entity");
Properties hibernateProperties = new Properties();
hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
hibernateProperties.put("hibernate.jdbc.batch_size", "20");
hibernateProperties.put("hibernate.order_inserts", "true");
hibernateProperties.put("hibernate.order_updates", "true");
sessionFactory.setHibernateProperties(hibernateProperties);
return sessionFactory;
}
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "email")
private String email;
// Getters and Setters
}
Hibernate এর মাধ্যমে একাধিক রেকর্ড একসাথে Insert করা:
@Repository
public class UserDao {
@Autowired
private SessionFactory sessionFactory;
public void batchInsertUsers(List<User> users) {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
int batchSize = 20; // Configured batch size
for (int i = 0; i < users.size(); i++) {
session.save(users.get(i));
if (i % batchSize == 0 && i > 0) {
session.flush();
session.clear();
}
}
transaction.commit();
session.close();
}
}
Hibernate এর মাধ্যমে একাধিক রেকর্ড একসাথে Update করা:
@Repository
public class UserDao {
@Autowired
private SessionFactory sessionFactory;
public void batchUpdateUsers(List<User> users) {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
int batchSize = 20; // Configured batch size
for (int i = 0; i < users.size(); i++) {
session.update(users.get(i));
if (i % batchSize == 0 && i > 0) {
session.flush();
session.clear();
}
}
transaction.commit();
session.close();
}
}
@Service
public class UserService {
@Autowired
private UserDao userDao;
public void saveUsersInBatch(List<User> users) {
userDao.batchInsertUsers(users);
}
public void updateUsersInBatch(List<User> users) {
userDao.batchUpdateUsers(users);
}
}
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/batch-insert")
public ResponseEntity<String> batchInsert(@RequestBody List<User> users) {
userService.saveUsersInBatch(users);
return ResponseEntity.ok("Users inserted in batch successfully");
}
@PutMapping("/batch-update")
public ResponseEntity<String> batchUpdate(@RequestBody List<User> users) {
userService.updateUsersInBatch(users);
return ResponseEntity.ok("Users updated in batch successfully");
}
}
session.clear()
এবং session.flush()
ব্যবহার করে মেমরি অপচয় রোধ।Hibernate/JPA এর মাধ্যমে Batch Insert এবং Update পরিচালনা ডেটা-ইনটেনসিভ অ্যাপ্লিকেশনগুলোর কার্যক্ষমতা বাড়ানোর জন্য একটি অত্যন্ত কার্যকর কৌশল।
Batch Processing হল একটি পদ্ধতি যেখানে একাধিক ডেটাবেজ অপারেশন (যেমন ইনসার্ট, আপডেট বা ডিলিট) একসঙ্গে কার্যকর করা হয়। এটি একাধিক ট্রানজেকশন পরিচালনা করার পরিবর্তে একটি ট্রানজেকশনে সম্পন্ন করে ডেটাবেজ অপারেশনের কার্যকারিতা এবং পারফরম্যান্স বৃদ্ধি করে।
Spring ORM Hibernate ব্যবহার করে Batch Processing সহজে বাস্তবায়ন করতে পারে।
Hibernate এর hibernate.jdbc.batch_size প্রপার্টি ব্যবহার করে ব্যাচ প্রসেসিং সক্রিয় করতে হয়।
উদাহরণ:
hibernate.jdbc.batch_size=20
এটি নির্দেশ করে একবারে ২০টি অপারেশন ব্যাচ হিসেবে সম্পন্ন করা হবে।
@Service
public class EmployeeService {
@Autowired
private SessionFactory sessionFactory;
@Transactional
public void saveEmployeesBatch(List<Employee> employees) {
Session session = sessionFactory.getCurrentSession();
int batchSize = 20; // প্রতিটি ব্যাচে ২০টি রেকর্ড প্রক্রিয়া হবে
for (int i = 0; i < employees.size(); i++) {
session.save(employees.get(i));
if (i % batchSize == 0) {
session.flush(); // ডেটা ডেটাবেজে লিখুন
session.clear(); // Hibernate ক্যাশ পরিষ্কার করুন
}
}
}
}
বর্ণনা:
session.save()
দিয়ে প্রতিটি অবজেক্ট সেভ করা হয়।session.flush()
ডেটাবেজে ব্যাচ রাইট অপারেশন সম্পন্ন করে।session.clear()
Hibernate এর ক্যাশ পরিষ্কার করে পরবর্তী ব্যাচের জন্য প্রস্তুত করে।@RestController
@RequestMapping("/employees")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@PostMapping("/batch")
public void saveEmployeesBatch(@RequestBody List<Employee> employees) {
employeeService.saveEmployeesBatch(employees);
}
}
বর্ণনা:
/employees/batch
এপিআই ব্যবহার করে একাধিক এমপ্লয়ি ব্যাচ হিসেবে ইনসার্ট করা যায়।@Service
public class EmployeeService {
@Autowired
private EntityManager entityManager;
@Transactional
public void saveEmployeesBatch(List<Employee> employees) {
int batchSize = 20; // প্রতিটি ব্যাচে ২০টি রেকর্ড প্রক্রিয়া হবে
for (int i = 0; i < employees.size(); i++) {
entityManager.persist(employees.get(i));
if (i % batchSize == 0) {
entityManager.flush(); // ডেটা ডেটাবেজে লিখুন
entityManager.clear(); // EntityManager ক্যাশ পরিষ্কার করুন
}
}
}
}
বর্ণনা:
entityManager.persist()
দিয়ে ডেটা ইনসার্ট করা হয়।entityManager.flush()
ডেটা ব্যাচ হিসেবে ডেটাবেজে পাঠায়।entityManager.clear()
মেমোরি ব্যবহারের দক্ষতার জন্য ক্যাশ পরিষ্কার করে।Spring ORM এর পরিবর্তে আপনি Spring Batch Framework ব্যবহার করেও বড় আকারের ডেটা প্রসেস করতে পারেন। এটি আরও শক্তিশালী এবং উন্নত ফিচার সরবরাহ করে।
Batch Processing সঠিকভাবে ব্যবহৃত হলে এটি ডেটাবেজ অপারেশনের সময় এবং খরচ কমিয়ে পারফরম্যান্স উন্নত করতে পারে।
Read more