Lazy এবং Eager Loading হল ডেটাবেস থেকে ডেটা লোড করার প্রক্রিয়ার ভিন্ন ভিন্ন কৌশল। এগুলো Hibernate বা JPA ব্যবহার করে ডেটাবেসের সম্পর্কিত (associations) ডেটা লোড করার ধরন নিয়ন্ত্রণ করে।
Lazy Loading
Lazy Loading একটি ডেটাবেস সম্পর্ক লোড করার প্রক্রিয়া, যেখানে প্রাথমিকভাবে শুধুমাত্র মেইন (primary) ডেটা লোড করা হয় এবং অ্যাসোসিয়েটেড ডেটা তখনই লোড হয় যখন সেটি প্রথমবার অ্যাক্সেস করা হয়।
বৈশিষ্ট্য:
- মেমরি ব্যবহার কম হয়।
- ডেটা লোডিংয়ের পারফরম্যান্স বেশি।
- অ্যাসোসিয়েটেড ডেটা প্রয়োজন না হলে এটি লোড হয় না।
Hibernate অ্যানোটেশন:
@OneToMany(fetch = FetchType.LAZY)
Eager Loading
Eager Loading একটি ডেটাবেস সম্পর্ক লোড করার প্রক্রিয়া, যেখানে মেইন ডেটার সঙ্গে সমস্ত অ্যাসোসিয়েটেড ডেটা প্রাথমিকভাবেই লোড করা হয়।
বৈশিষ্ট্য:
- লোডিং প্রক্রিয়া তুলনামূলক ধীর।
- অ্যাসোসিয়েটেড ডেটা সঙ্গে সঙ্গেই অ্যাক্সেস করা যায়।
- বড় ডেটাসেটের ক্ষেত্রে অপ্রয়োজনীয় মেমরি ব্যবহারের সম্ভাবনা থাকে।
Hibernate অ্যানোটেশন:
@OneToMany(fetch = FetchType.EAGER)
উদাহরণ: Lazy এবং Eager Loading
Entity: Department এবং Employee
Department Entity
import jakarta.persistence.*;
import java.util.List;
@Entity
@Table(name = "departments")
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "department", fetch = FetchType.LAZY)
private List<Employee> employees;
// Getters and Setters
}
Employee Entity
import jakarta.persistence.*;
@Entity
@Table(name = "employees")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
// Getters and Setters
}
Lazy Loading উদাহরণ
Lazy লোডিং কনফিগারেশনে Department ক্লাসের employees সম্পর্ক শুধুমাত্র তখনই লোড হবে যখন getEmployees() মেথড কল করা হবে।
Lazy Loading Controller
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/departments")
public class DepartmentController {
@Autowired
private DepartmentRepository departmentRepository;
@GetMapping("/{id}")
public Department getDepartment(@PathVariable Long id) {
Department department = departmentRepository.findById(id).orElse(null);
// Lazy Loading: Employees data will load only when getEmployees() is called
if (department != null) {
System.out.println(department.getEmployees());
}
return department;
}
}
Eager Loading উদাহরণ
Eager লোডিং কনফিগারেশনে employees সম্পর্ক ডিপার্টমেন্ট লোড করার সময় সঙ্গে সঙ্গেই লোড হয়ে যাবে।
Eager Loading কনফিগারেশন
@OneToMany(mappedBy = "department", fetch = FetchType.EAGER)
private List<Employee> employees;
Eager Loading Controller
@RestController
@RequestMapping("/departments")
public class DepartmentController {
@Autowired
private DepartmentRepository departmentRepository;
@GetMapping("/{id}")
public Department getDepartment(@PathVariable Long id) {
Department department = departmentRepository.findById(id).orElse(null);
// Eager Loading: Employees data is already loaded with the department
return department;
}
}
Lazy এবং Eager Loading এর পার্থক্য
| বৈশিষ্ট্য | Lazy Loading | Eager Loading |
|---|---|---|
| লোডিং টাইম | অ্যাসোসিয়েটেড ডেটা প্রথমবার অ্যাক্সেস করার সময় লোড হয়। | মেইন ডেটার সঙ্গে সঙ্গে অ্যাসোসিয়েটেড ডেটা লোড হয়। |
| পারফরম্যান্স | মেমরি কম ব্যবহৃত হয়। | বেশি মেমরি ব্যবহৃত হয়। |
| ব্যবহার উপযুক্ততা | যখন অ্যাসোসিয়েটেড ডেটা সবসময় প্রয়োজন হয় না। | যখন অ্যাসোসিয়েটেড ডেটা সবসময় প্রয়োজন। |
Lazy এবং Eager Loading এর সঠিক ব্যবহারের মাধ্যমে ডেটাবেস অপারেশন আরও কার্যকর এবং মেমরি ব্যবহারে দক্ষ করে তোলা যায়।
Read more