Java Technologies Hibernate এ Lazy এবং Eager Fetching গাইড ও নোট

347

Lazy fetching এবং Eager fetching হল Hibernate ORM-এ ডেটা লোড করার দুটি ভিন্ন কৌশল। Hibernate-এ সম্পর্কিত অবজেক্টগুলি (যেমন: One-to-One, One-to-Many, Many-to-One, Many-to-Many) লোড করার সময়, Hibernate কীভাবে সম্পর্কিত ডেটা লোড করবে, তা নির্ধারণের জন্য আপনি এই দুটি ফেচিং পদ্ধতি ব্যবহার করতে পারেন।

Lazy Fetching:

Lazy fetching হল একটি ডেটা লোড করার কৌশল যেখানে সম্পর্কিত অবজেক্টটি তখনই লোড করা হয় যখন সেটি প্রকৃতপক্ষে প্রয়োজন হয়। সহজভাবে বলতে, Lazy loading হল একটি "নদী" পদ্ধতি, যেখানে ডেটা শুধুমাত্র তখনই লোড করা হয় যখন এটি অ্যাক্সেস করা হয়।

Lazy Loading ব্যবহার করার ফলে কিছু স্থানে performance optimization পাওয়া যায়, কারণ শুধুমাত্র প্রয়োজনীয় ডেটা লোড করা হয় এবং অপ্রয়োজনীয় ডেটা লোড করা হয় না।

Lazy Fetching এর উদাহরণ:

ধরা যাক, আমাদের একটি Employee এবং Department ক্লাস আছে, এবং Employee ক্লাসের মধ্যে Department একটি Many-to-One সম্পর্ক হিসেবে রয়েছে।

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;

    @ManyToOne(fetch = FetchType.LAZY)  // Lazy Fetching
    @JoinColumn(name = "department_id")
    private Department department;

    // Getters and Setters
}

@Entity
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    private String departmentName;

    // Getters and Setters
}

এখানে, @ManyToOne(fetch = FetchType.LAZY) দ্বারা Lazy fetching কনফিগার করা হয়েছে। এর মানে হল যে, যখন একটি Employee অবজেক্ট লোড করা হবে, তখন Department অবজেক্টটি তখনই লোড হবে, যখন employee.getDepartment() কল করা হবে।


Eager Fetching:

Eager fetching হল একটি ডেটা লোড করার কৌশল যেখানে সম্পর্কিত অবজেক্টগুলি তথ্য লোড করার সময় অটোমেটিকভাবে লোড হয়, তা না হলে কেবল যখন সেগুলি ব্যবহার করা হয় না।

এটি সাধারণত তখন ব্যবহৃত হয়, যখন সম্পর্কিত অবজেক্টগুলি সবসময়ই প্রয়োজন, এবং আপনি সেই অবজেক্টগুলিকে আলাদা করে লোড করতে চান না।

Eager Fetching এর উদাহরণ:

ধরা যাক, আমাদের একই Employee এবং Department ক্লাস আছে, কিন্তু এবার আমরা Eager fetching ব্যবহার করব:

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;

    @ManyToOne(fetch = FetchType.EAGER)  // Eager Fetching
    @JoinColumn(name = "department_id")
    private Department department;

    // Getters and Setters
}

@Entity
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    private String departmentName;

    // Getters and Setters
}

এখানে, @ManyToOne(fetch = FetchType.EAGER) দ্বারা Eager fetching কনফিগার করা হয়েছে, যার মানে হল যে যখন Employee অবজেক্ট লোড হবে, তখন সাথে সাথে Department অবজেক্টটিও লোড হয়ে যাবে, এমনকি যখন department এ অ্যাক্সেস করা না হয়।


Lazy Fetching এবং Eager Fetching এর মধ্যে পার্থক্য

CriteriaLazy FetchingEager Fetching
Definitionসম্পর্কিত অবজেক্টগুলো তখনই লোড হয় যখন তাদের প্রয়োজন হয়।সম্পর্কিত অবজেক্টগুলো সাথে সাথে লোড হয়ে যায়।
Performanceসাধারণত আরও ভাল পারফরম্যান্স দেয় কারণ ডেটা অপ্রয়োজনীয়ভাবে লোড করা হয় না।প্রাথমিক লোডের সময় অতিরিক্ত ডেটা লোড করা হয়, যা পারফরম্যান্সে খারাপ প্রভাব ফেলতে পারে।
Use Caseযখন সম্পর্কিত অবজেক্টগুলো সবসময় প্রয়োজন হয় না।যখন সম্পর্কিত অবজেক্টগুলো সবসময় প্রয়োজন হয়।
Risk of N+1 QueryN+1 Query সমস্যা হতে পারে যখন Lazy-loaded অবজেক্টগুলো একাধিকবার অ্যাক্সেস করা হয়।Eager fetching এর মাধ্যমে N+1 query সমস্যা এড়ানো যায়।
Memory Consumptionকম মেমরি ব্যবহৃত হয় কারণ অপ্রয়োজনীয় ডেটা লোড হয় না।বেশি মেমরি ব্যবহৃত হয় কারণ সব সম্পর্কিত ডেটা একসাথে লোড হয়।

Lazy Fetching এবং Eager Fetching এর প্রয়োজনীয়তা:

  1. Lazy Fetching:
    • Performance Optimization: শুধুমাত্র প্রয়োজনীয় ডেটা লোড করার মাধ্যমে মেমরি ব্যবস্থাপনা এবং পারফরম্যান্স উন্নত করা যায়।
    • Avoid Unnecessary Data Loading: যখন সম্পর্কিত অবজেক্টগুলি সবসময় প্রয়োজন হয় না, তখন Lazy Fetching আপনার অ্যাপ্লিকেশনকে অপটিমাইজ করে।
  2. Eager Fetching:
    • Avoid Multiple Queries: যদি সম্পর্কিত ডেটা সবসময় প্রয়োজন হয়, তবে Eager Fetching ব্যবহারের মাধ্যমে N+1 Query সমস্যার সমাধান করা যেতে পারে।
    • Simplified Data Access: সম্পর্কিত অবজেক্টগুলি একটি একক কুয়েরিতে লোড হওয়ায় কোড সহজ হয়, এবং ডেটাবেসে বার বার query চালানোর প্রয়োজন পড়ে না।

Hibernate তে Fetching Strategy কনফিগার করার উপায়:

Hibernate তে FetchType.LAZY এবং FetchType.EAGER এর মাধ্যমে লোডিং স্ট্রাটেজি কনফিগার করা হয়।

Lazy Fetching Example (Annotation):

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "department_id")
private Department department;

Eager Fetching Example (Annotation):

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "department_id")
private Department department;

এছাড়া, আপনি @Fetch অ্যানোটেশন ব্যবহার করে Hibernate specific fetching strategies যেমন FetchMode.JOIN বা FetchMode.SELECT ব্যবহার করতে পারেন।

Using FetchMode in Hibernate:

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@ManyToOne
@Fetch(FetchMode.JOIN)
@JoinColumn(name = "department_id")
private Department department;
  • FetchMode.JOIN: এটি Eager fetch করে এবং একসাথে ডেটা লোড করার জন্য JOIN ব্যবহার করে।
  • FetchMode.SELECT: এটি Lazy fetch করে এবং আলাদা করে SELECT কুয়েরি চালায়।

  • Lazy Fetching হল এক ধরনের ডেটা লোডিং কৌশল যেখানে সম্পর্কিত অবজেক্টটি তখনই লোড হয় যখন তা প্রয়োজন হয়। এটি পারফরম্যান্স এবং মেমরি ব্যবস্থাপনার জন্য উপকারী।
  • Eager Fetching হল একটি কৌশল যেখানে সম্পর্কিত অবজেক্টটি সাথে সাথে লোড হয়ে যায়। এটি N+1 query সমস্যা সমাধানে সহায়ক এবং ডেটাবেসে কম কুয়েরি চালানোর জন্য উপকারী।
  • Hibernate এর Lazy এবং Eager Fetching কৌশলগুলি ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনের পারফরম্যান্স এবং ডেটা লোডিংয়ের আচরণ নিয়ন্ত্রণ করতে পারেন।
Content added By
Promotion

Are you sure to start over?

Loading...