Lazy Loading এবং Eager Loading এর ধারণা

Lazy Loading এবং Eager Loading - আইবাটিস (iBATIS) - Java Technologies

343

iBATIS (বর্তমানে MyBatis নামে পরিচিত) একটি SQL Mapping Framework যা Java objects এবং SQL স্টেটমেন্টগুলির মধ্যে সম্পর্ক স্থাপন করে। iBATIS (MyBatis) ORM-এর তুলনায় SQL-ভিত্তিক, যেখানে আপনি ম্যানুয়ালি SQL স্টেটমেন্ট লিখে ডেটাবেসের সাথে যোগাযোগ করেন। তবে, MyBatis-এ Lazy Loading এবং Eager Loading এর মতো ফিচার রয়েছে, যা ডেটাবেসের অপটিমাইজড এক্সেস এবং সম্পর্কিত ডেটা লোডিং পরিচালনা করতে সহায়তা করে।

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


Lazy Loading: ধারণা

Lazy Loading এমন একটি লোডিং পদ্ধতি যেখানে সম্পর্কিত ডেটা তখনই লোড করা হয় যখন তা প্রথমবার প্রয়োজন হয়। অর্থাৎ, কোনো সম্পর্কিত অবজেক্ট (যেমন, Many-to-One, One-to-Many) শুরুতে লোড করা হয় না, বরং access করার সময় তা লোড হয়। এই পদ্ধতিতে performance optimization করা যায় কারণ অপ্রয়োজনীয় ডেটা প্রথমেই লোড করা হয় না।

Lazy LoadingSQL query তখনই রান হয়, যখন ডেটার প্রয়োজন হয়। এটি N+1 Query Problem সৃষ্টি করতে পারে, যেখানে একাধিক SELECT কুয়েরি চালাতে হয় সম্পর্কিত ডেটা লোড করার জন্য।

Lazy Loading উদাহরণ:

ধরা যাক, আমাদের Employee এবং Department এর মধ্যে একটি সম্পর্ক আছে এবং Department সম্পর্কটি Lazy Loading মোডে কনফিগার করা হয়েছে।

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

    private String name;

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

    // Getters and Setters
}

এখানে, FetchType.LAZY ব্যবহৃত হয়েছে, যার মানে হল যে Department অবজেক্টটি প্রথমে লোড হবে না। এটি তখনই লোড হবে যখন employee.getDepartment() কল করা হবে।

Lazy Loading এর সুবিধা:

  • Performance Optimization: ডেটা লোডের সময় কেবলমাত্র প্রয়োজনীয় ডেটা লোড করা হয়, যা পারফরম্যান্স উন্নত করতে সাহায্য করে।
  • Reduced Memory Usage: শুধুমাত্র প্রয়োজনীয় সম্পর্কিত ডেটাই মেমরিতে লোড হয়, যার ফলে মেমরি সঞ্চয়ের সুবিধা পাওয়া যায়।

Lazy Loading এর সমস্যা:

  • N+1 Query Problem: যখন সম্পর্কিত ডেটা লোড করার জন্য একাধিক SELECT কুয়েরি চলে, তখন N+1 Query Problem সৃষ্টি হতে পারে।
  • Performance Issues: যদি ডেটা অ্যাক্সেস করার জন্য অনেক বার লোড করা হয়, তবে এটি পারফরম্যান্সকে খারাপ করতে পারে।

Eager Loading: ধারণা

Eager Loading হল একটি লোডিং পদ্ধতি যেখানে সম্পর্কিত ডেটা প্রথম থেকেই লোড করা হয়, অর্থাৎ যখন প্রধান অবজেক্টটি লোড হয়, তখন তার সম্পর্কিত অবজেক্টগুলোও লোড হয়ে যায়। এই পদ্ধতিতে SQL query একসাথে চলে এবং সমস্ত সম্পর্কিত ডেটা একসাথে লোড হয়।

Eager Loading ব্যবহার করলে, সম্পর্কিত সব ডেটা একসাথে লোড হয়ে যায় এবং এতে N+1 Query সমস্যা দূর করা যায়। তবে, এটি memory এবং performance এর ওপর নেতিবাচক প্রভাব ফেলতে পারে যদি আপনার প্রয়োজন না হয় এমন সমস্ত সম্পর্ক লোড হয়।

Eager Loading উদাহরণ:

ধরা যাক, আমাদের Employee এবং Department এর মধ্যে একটি সম্পর্ক আছে এবং Department সম্পর্কটি Eager Loading মোডে কনফিগার করা হয়েছে।

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

    private String name;

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

    // Getters and Setters
}

এখানে, FetchType.EAGER ব্যবহৃত হয়েছে, যার মানে হল যে যখন Employee অবজেক্টটি লোড হবে, তখন Department সম্পর্কিত ডেটাও সাথে সাথে লোড হবে।

Eager Loading এর সুবিধা:

  • No N+1 Query Problem: সমস্ত সম্পর্কিত ডেটা একসাথে লোড হওয়ায় N+1 Query সমস্যা এড়ানো যায়।
  • Simpler Code: সম্পর্কিত ডেটা আগে থেকেই লোড হয়ে থাকে, তাই বারবার ডেটা লোড করার প্রয়োজন নেই, যা কোডের সরলতা বাড়ায়।

Eager Loading এর সমস্যা:

  • Performance Issues: যদি খুব বেশি সম্পর্কিত ডেটা থাকে, তাহলে সমস্ত সম্পর্ক একসাথে লোড হওয়ার ফলে পারফরম্যান্সে খারাপ প্রভাব ফেলতে পারে।
  • Memory Consumption: একাধিক সম্পর্ক একসাথে লোড হলে অতিরিক্ত মেমরি খরচ হতে পারে।

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

CriteriaLazy LoadingEager Loading
Definitionসম্পর্কিত ডেটা তখনই লোড হয় যখন তা প্রাথমিকভাবে প্রয়োজন হয়।সম্পর্কিত ডেটা অবজেক্ট লোড করার সাথে সাথে লোড হয়।
Performanceপারফরম্যান্স উন্নত হতে পারে, কারণ অপ্রয়োজনীয় ডেটা লোড হয় না।প্রথমে ডেটা একসাথে লোড হওয়ায় বেশি মেমরি ব্যবহার হতে পারে।
Memory Usageকম মেমরি ব্যবহার হয় কারণ ডেটা কেবলমাত্র প্রয়োজনীয় সময়ে লোড হয়।মেমরি বেশি ব্যবহার হতে পারে, কারণ সম্পর্কিত সমস্ত ডেটা একসাথে লোড হয়।
Use Caseযখন সম্পর্কিত ডেটা সবসময় প্রয়োজন হয় না।যখন সম্পর্কিত ডেটা সবসময় প্রয়োজন হয়।
Risk of N+1 QueryN+1 Query সমস্যা হতে পারে।N+1 Query সমস্যা এড়ানো যায়।
Complexityকোডে আরও বেশি fetching লজিক থাকতে পারে।সহজ, কারণ সমস্ত সম্পর্ক একসাথে লোড হয়।

MyBatis (iBATIS) তে Lazy এবং Eager Loading

MyBatis (iBATIS) তে Lazy এবং Eager লোডিং কনফিগার করার জন্য, @FetchType.LAZY বা @FetchType.EAGER অ্যানোটেশন ব্যবহার করা যায়, তবে এটি একটি ORM ফিচার নয়। MyBatis-এ, Lazy Loading এবং Eager Loading সাধারণত association mapping এর মাধ্যমে কনফিগার করা হয়, যেমন:

Lazy Loading Example (MyBatis):

<resultMap id="employeeResultMap" type="com.example.Employee">
    <result property="department" column="department_id" fetchType="lazy"/>
</resultMap>

Eager Loading Example (MyBatis):

<resultMap id="employeeResultMap" type="com.example.Employee">
    <result property="department" column="department_id" fetchType="eager"/>
</resultMap>

  • Lazy Loading তখন ব্যবহার করা হয় যখন সম্পর্কিত ডেটা প্রথমে প্রয়োজন হয় না এবং এটি পারফরম্যান্স অপটিমাইজেশনের জন্য উপযোগী। তবে N+1 Query Problem এড়ানোর জন্য অতিরিক্ত কৌশল প্রয়োগ করা হতে পারে।
  • Eager Loading তখন ব্যবহৃত হয় যখন সম্পর্কিত ডেটা সবসময়ই প্রয়োজন এবং আপনি চাইছেন যে ডেটা একসাথে লোড হোক। এটি N+1 Query সমস্যা সমাধান করতে সাহায্য করে, তবে মেমরি ব্যবহারে অতিরিক্ত হতে পারে।

MyBatis (iBATIS) তে Lazy Loading এবং Eager Loading ব্যবহারের মাধ্যমে আপনার অ্যাপ্লিকেশনটি ডেটাবেসের ডেটা অ্যাক্সেসের পারফরম্যান্স এবং মেমরি ব্যবস্থাপনা উন্নত হতে পারে।

Content added By
Promotion

Are you sure to start over?

Loading...