FetchType.LAZY এবং FetchType.EAGER এর ব্যবহার

Java Technologies - স্প্রিং বুট জেপিএ (Spring Boot JPA) - Lazy এবং Eager Loading
356

Spring Boot JPA এবং Fetch Types

Spring Boot JPA এবং JPA (Java Persistence API) একটি ডেটাবেসের সাথে কাজ করার সময় fetching strategy ব্যবহার করে ডেটা লোড করার উপায় নির্ধারণ করে। FetchType.LAZY এবং FetchType.EAGER হল দুটি জনপ্রিয় fetching strategy যা @OneToMany, @ManyToOne, @OneToOne, এবং @ManyToMany সম্পর্কিত এনটিটিতে ব্যবহার করা হয়। এগুলি ডেটাবেস সম্পর্কিত data fetching behavior কন্ট্রোল করে।

  • FetchType.LAZY: যখন ডেটা শুধুমাত্র প্রয়োজন হলে লোড হয়।
  • FetchType.EAGER: যখন ডেটা অবিলম্বে লোড হয়, অর্থাৎ সম্পর্কিত সমস্ত ডেটা একসাথে লোড হয়।

এখানে আমরা FetchType.LAZY এবং FetchType.EAGER এর ব্যবহার এবং প্রভাব আলোচনা করব।


1. FetchType.LAZY

FetchType.LAZY ব্যবহার করলে, যখন সম্পর্কিত Entity এর ডেটার প্রয়োজন হবে তখন ডেটা লোড করা হয়। এটি lazy loading কৌশল অনুসরণ করে, যেখানে নিউনতম ডেটা লোড হয় যতক্ষণ না সেই ডেটার প্রয়োজন হয়। এটি সাধারণত ডেটা লোডিং পারফরম্যান্স উন্নত করতে ব্যবহৃত হয়।

উদাহরণ: FetchType.LAZY

ধরা যাক, আমাদের একটি Author এবং Book Entity রয়েছে, যেখানে একাধিক Book একটি Author এর সাথে সম্পর্কিত।

Author Entity:

package com.example.model;

import javax.persistence.*;
import java.util.List;

@Entity
public class Author {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToMany(mappedBy = "author", fetch = FetchType.LAZY)  // Lazy fetching for books
    private List<Book> books;

    // Getters and Setters
}

Book Entity:

package com.example.model;

import javax.persistence.*;

@Entity
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @ManyToOne(fetch = FetchType.LAZY)  // Lazy loading for author
    @JoinColumn(name = "author_id")
    private Author author;

    // Getters and Setters
}

এখানে, Author Entity এর books প্রপার্টিতে fetch = FetchType.LAZY ব্যবহার করা হয়েছে, যার মানে হলো Author এর Books শুধুমাত্র যখন প্রয়োজন হবে তখনই লোড হবে। অর্থাৎ, যদি Author অবজেক্টে books প্রপার্টি অ্যাক্সেস না করা হয়, তাহলে বইয়ের ডেটা লোড হবে না। এটি পারফরম্যান্স উন্নত করার জন্য ব্যবহৃত হয়।


2. FetchType.EAGER

FetchType.EAGER ব্যবহার করলে, যখন ডেটাবেসে মূল Entity লোড হবে, তখন সম্পর্কিত Entity গুলিও অবিলম্বে লোড হবে। অর্থাৎ, এটি eager loading কৌশল অনুসরণ করে, যেখানে সম্পর্কিত সমস্ত ডেটা একসাথে লোড হয়।

উদাহরণ: FetchType.EAGER

ধরা যাক, আমাদের আবার Author এবং Book Entity রয়েছে, কিন্তু এবার FetchType.EAGER ব্যবহার করা হচ্ছে।

Author Entity:

package com.example.model;

import javax.persistence.*;
import java.util.List;

@Entity
public class Author {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToMany(mappedBy = "author", fetch = FetchType.EAGER)  // Eager fetching for books
    private List<Book> books;

    // Getters and Setters
}

Book Entity:

package com.example.model;

import javax.persistence.*;

@Entity
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @ManyToOne(fetch = FetchType.EAGER)  // Eager loading for author
    @JoinColumn(name = "author_id")
    private Author author;

    // Getters and Setters
}

এখানে, Author Entity এর books প্রপার্টিতে fetch = FetchType.EAGER ব্যবহার করা হয়েছে, যার মানে হলো Author Entity লোড হলে, সংশ্লিষ্ট books এর ডেটা অবিলম্বে লোড হবে। একসাথে Author এবং Books এর ডেটা লোড করা হবে, যা কিছুক্ষেত্রে পারফরম্যান্সে প্রভাব ফেলতে পারে।


3. Lazy vs Eager Loading: Performance Considerations

3.1. Lazy Loading:

  • পারফরম্যান্স: Lazy loading পারফরম্যান্সের জন্য ভালো হতে পারে, কারণ এটি শুধুমাত্র প্রয়োজনীয় ডেটা লোড করে এবং অপ্রয়োজনীয় ডেটা লোড হওয়া এড়িয়ে যায়।
  • ব্যবহার: বড় পরিমাণ ডেটা সহ সম্পর্কিত অবজেক্টের জন্য এটি উপকারী। উদাহরণস্বরূপ, যদি আপনি সম্পর্কিত অবজেক্টের অনেক ডেটা লোড না করতে চান, তবে FetchType.LAZY ব্যবহার করতে পারেন।

3.2. Eager Loading:

  • পারফরম্যান্স: Eager loading কিছু ক্ষেত্রে পারফরম্যান্স কমাতে পারে, বিশেষ করে যখন অনেক সম্পর্কিত ডেটা লোড করা হয়। যদি অনেক সম্পর্কিত ডেটা লোড করতে হয়, তাহলে বড় query তৈরি হবে এবং ডেটাবেস থেকে অনেক ডেটা একসাথে আসবে।
  • ব্যবহার: এটি উপকারী হতে পারে যখন আপনি একটি Entity এর সাথে সম্পর্কিত সব ডেটা প্রাথমিকভাবে লোড করতে চান।

4. Best Practices

4.1. Lazy Loading এর ব্যবহার:

  • অন্তর্নিহিত ডেটা অ্যাক্সেস: যখন আপনি সম্পর্কিত ডেটার প্রয়োজন হবে না, তখন Lazy loading ব্যবহার করুন। উদাহরণস্বরূপ, যদি আপনি প্রথমে কেবল মূল Entity এর ডেটা অ্যাক্সেস করতে চান এবং পরে সম্পর্কিত ডেটা অ্যাক্সেস করতে চান, তবে Lazy loading ব্যবহার করা উচিত।

4.2. Eager Loading এর ব্যবহার:

  • ডেটার প্রয়োজন: যদি আপনি নিশ্চিত হন যে, সম্পর্কিত সমস্ত ডেটা প্রয়োজন এবং আপনি সব ডেটা একসাথে লোড করতে চান, তবে Eager loading উপযুক্ত।
  • ডেটাবেস অপ্টিমাইজেশন: সব সময় চেষ্টা করুন যেন Eager loading শুধুমাত্র নির্দিষ্ট প্রয়োজনে ব্যবহার করা হয়, কারণ এটি ডেটাবেসের কার্যকারিতা এবং লোড টাইমকে প্রভাবিত করতে পারে।

5. @EntityGraph ব্যবহার করে Custom Fetching Strategy

Spring Data JPA তে, আপনি @EntityGraph ব্যবহার করে কাস্টম fetching স্ট্রাটেজি তৈরি করতে পারেন, যেখানে আপনাকে FetchType.EAGER বা FetchType.LAZY এর মতো স্ট্যাটিক কৌশল নির্ধারণের পরিবর্তে, ডাইনামিকভাবে fetching strategy নির্ধারণ করতে দেয়।

উদাহরণ:

package com.example.repository;

import com.example.model.Author;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface AuthorRepository extends JpaRepository<Author, Long> {

    @EntityGraph(attributePaths = {"books"})
    List<Author> findAllWithBooks();
}

এখানে, @EntityGraph ব্যবহার করে books প্রপার্টি লোড করা হচ্ছে এবং এটি EAGER fetching এর মতো আচরণ করবে, তবে কেবলমাত্র যখন প্রয়োজন।


সারাংশ

Spring Boot JPA তে FetchType.LAZY এবং FetchType.EAGER ডেটা লোড করার দুটি প্রধান কৌশল। FetchType.LAZY ডেটা তখনই লোড হয় যখন তার প্রয়োজন হয়, যা পারফরম্যান্সের জন্য উপকারী। অন্যদিকে, FetchType.EAGER সম্পর্কিত সমস্ত ডেটা অবিলম্বে লোড করে, যা কিছু পরিস্থিতিতে দরকারি হতে পারে, কিন্তু পারফরম্যান্সে প্রভাব ফেলতে পারে। এছাড়াও, @EntityGraph ব্যবহার করে কাস্টম fetching strategy তৈরি করা যেতে পারে।

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


Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...