Spring ORM-এ Lazy Loading এবং Eager Loading হল ডেটা ফেচিং (Data Fetching) স্ট্র্যাটেজি, যা Hibernate বা JPA-এর মাধ্যমে Entity Mapping-এর সময় ব্যবহৃত হয়। এই দুটি ধারণা ডাটাবেস থেকে ডেটা রিট্রাইভ করার পদ্ধতি নির্দেশ করে।
Lazy Loading
Lazy Loading এমন একটি কৌশল যেখানে শুধুমাত্র প্রয়োজনীয় ডেটা রিট্রাইভ করা হয়। ডেটা তখনই লোড হয়, যখন এটি ব্যবহার করার চেষ্টা করা হয়। এটি মেমরি এবং পারফরম্যান্স অপ্টিমাইজ করার জন্য কার্যকর।
বৈশিষ্ট্য:
- ডেটা লোড করার সময় বিলম্ব করে (Deferred Loading)।
- প্রাথমিকভাবে ডেটাবেস থেকে শুধুমাত্র মূল Entity-এর ডেটা আনা হয়।
- যখন অ্যাসোসিয়েটেড ডেটা প্রয়োজন হয়, তখন ডাটাবেস কল করা হয়।
উদাহরণ:
@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
}
এখানে orders সম্পর্কটি Lazy Loading করা হয়েছে। orders-এ অ্যাক্সেস করার আগে ডাটাবেসে কোনো কল হবে না।
Eager Loading
Eager Loading এমন একটি কৌশল যেখানে Entity-এর সাথে সম্পর্কিত সমস্ত ডেটা একসাথে রিট্রাইভ করা হয়। যখনই Entity লোড করা হয়, অ্যাসোসিয়েটেড ডেটাগুলিও একসাথে লোড হয়।
বৈশিষ্ট্য:
- প্রাথমিকভাবে সমস্ত অ্যাসোসিয়েটেড ডেটা লোড করা হয়।
- একাধিক ডাটাবেস কল এড়াতে পারে।
- মেমরি ব্যবহারে বেশি চাপ ফেলতে পারে, বিশেষত যদি সব ডেটা প্রয়োজন না হয়।
উদাহরণ:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
private List<Order> orders;
// Getters and Setters
}
এখানে orders সম্পর্কটি Eager Loading করা হয়েছে। User লোড করার সময় orders তালিকাও ডাটাবেস থেকে রিট্রাইভ হবে।
Lazy Loading এবং Eager Loading এর পার্থক্য
| প্যারামিটার | Lazy Loading | Eager Loading |
|---|---|---|
| ডেটা লোডিং সময় | প্রয়োজন হলে ডেটা লোড হয়। | Entity লোড করার সময়ই সমস্ত সম্পর্কিত ডেটা লোড হয়। |
| মেমরি ব্যবহারে প্রভাব | মেমরি ব্যবহারে কার্যকর, কারণ প্রয়োজনীয় ডেটা লোড হয়। | মেমরি ব্যবহারে বেশি চাপ ফেলতে পারে। |
| পারফরম্যান্স | প্রথমে দ্রুত, কারণ কম ডেটা লোড হয়। | প্রথমে ধীর, কারণ সব ডেটা একসাথে লোড হয়। |
| ডাটাবেস কল | সম্পর্কিত ডেটা অ্যাক্সেস করার সময় আলাদা ডাটাবেস কল হয়। | একবারেই একাধিক ডাটাবেস কল হতে পারে। |
| ব্যবহার উপযোগিতা | বড় ডেটাসেট বা প্রায়শই পরিবর্তনশীল ডেটার জন্য উপযুক্ত। | ছোট ডেটাসেট বা প্রয়োজনীয় ডেটার জন্য উপযুক্ত। |
Lazy এবং Eager Loading এর বাস্তব প্রয়োগ
Lazy Loading উদাহরণ:
User user = session.get(User.class, 1L);
System.out.println(user.getName()); // Only User data is fetched.
System.out.println(user.getOrders()); // Orders data is fetched here.
Eager Loading উদাহরণ:
User user = session.get(User.class, 1L);
System.out.println(user.getName()); // Both User and Orders data are fetched together.
System.out.println(user.getOrders()); // Already fetched data is used.
Lazy Loading সমস্যা এবং সমাধান
LazyInitializationException
Lazy Loading ব্যবহারের সময়, যদি Hibernate সেশনের বাইরে অ্যাসোসিয়েটেড ডেটা অ্যাক্সেস করা হয়, তাহলে এই সমস্যা দেখা দেয়।
সমাধান:
- Hibernate.initialize() ব্যবহার করা।
@Transactionalব্যবহার করে সেশন খোলা রাখা।- FetchType
EAGERসেট করা (যদি সমস্ত ডেটা একসাথে প্রয়োজন হয়)।
Lazy Loading এবং Eager Loading-এর মধ্যে সঠিক পদ্ধতি নির্বাচন করার সময় অ্যাপ্লিকেশনের প্রয়োজনীয়তা এবং পারফরম্যান্স বিবেচনা করা উচিত।
Read more