Lazy এবং Eager Fetching এর জন্য Best Practices

Java Technologies - জেপিএ  (JPA) - JPA Performance Optimization Techniques
223

JPA (Java Persistence API) তে Lazy Fetching এবং Eager Fetching দুটি জনপ্রিয় কৌশল যা Entity এবং তার সম্পর্কিত ডেটা (যেমন, OneToMany, ManyToOne, OneToOne) লোড করার জন্য ব্যবহৃত হয়। এই দুটি কৌশল পারফরম্যান্স এবং রিসোর্স ব্যবস্থাপনায় পার্থক্য তৈরি করে। JPA তে Lazy Loading এবং Eager Loading ব্যবহার করার সময় সঠিক পদ্ধতি অনুসরণ করা গুরুত্বপূর্ণ, কারণ এটি অ্যাপ্লিকেশনের পারফরম্যান্স এবং রেসপন্স টাইমে গুরুত্বপূর্ণ প্রভাব ফেলতে পারে।

Lazy Fetching


Lazy Fetching হল একটি কৌশল যেখানে সম্পর্কিত Entity বা ফিচারগুলি কেবলমাত্র যখন প্রয়োজন হয় তখনই লোড করা হয়। এটি ডেটাবেস থেকে অতিরিক্ত ডেটা না নিয়ে পারফরম্যান্স অপ্টিমাইজেশন করতে সহায়তা করে।

Lazy Fetching এর বৈশিষ্ট্য:

  • প্রথমে মূল Entity লোড হয়: সম্পর্কিত অবজেক্ট বা অ্যাসোসিয়েশন (যেমন OneToMany, ManyToOne) শুধুমাত্র নির্দিষ্ট সময়ে লোড হয়, যখন আপনি সেটি explicitly অ্যাক্সেস করেন।
  • ডেটাবেস কল কমানো: সম্পর্কিত ডেটা লোড করার জন্য অতিরিক্ত ডেটাবেস কল হয় না, যতক্ষণ না সেটি প্রয়োজন হয়।
  • পারফরম্যান্স অপ্টিমাইজেশন: ডেটাবেসে প্রয়োজনীয় ডেটা কম লোড করার কারণে পারফরম্যান্স ভালো থাকে।

Lazy Fetching Example:

@Entity
public class Order {

    @Id
    private Long id;
    private String productName;
    
    @ManyToOne(fetch = FetchType.LAZY)
    private Customer customer;  // Lazy loading

    // Getter and Setter methods
}

এখানে, @ManyToOne(fetch = FetchType.LAZY) এর মাধ্যমে customer সম্পর্কটি Lazy লোড হচ্ছে, অর্থাৎ Order Entity লোড হওয়া পর্যন্ত Customer Entity লোড হবে না।

Eager Fetching


Eager Fetching হল একটি কৌশল যেখানে সম্পর্কিত Entity বা ফিচারগুলি অটোমেটিক্যালি লোড হয় যখন মূল Entity লোড হয়। এই কৌশলটি যখন সব সম্পর্কিত ডেটা একসাথে লোড করতে হয়, তখন ব্যবহার করা হয়।

Eager Fetching এর বৈশিষ্ট্য:

  • সম্পর্কিত সমস্ত ডেটা একসাথে লোড হয়: সম্পর্কিত অবজেক্ট বা অ্যাসোসিয়েশন গুলো মূল Entity লোড হওয়ার সময় একসাথে লোড হয়।
  • ডেটাবেস কল বাড়ানো: সব সম্পর্কিত ডেটা একসাথে লোড করার কারণে ডেটাবেসে অতিরিক্ত কল হতে পারে, যা পারফরম্যান্স হ্রাস করতে পারে।
  • পারফরম্যান্স প্রভাব: যদি সম্পর্কিত ডেটা বেশি হয়, তবে Eager Fetching অ্যাপ্লিকেশনকে ধীর করে দিতে পারে, কারণ সমস্ত সম্পর্কিত ডেটা ডেটাবেস থেকে একসাথে নিয়ে আসা হয়।

Eager Fetching Example:

@Entity
public class Order {

    @Id
    private Long id;
    private String productName;
    
    @ManyToOne(fetch = FetchType.EAGER)
    private Customer customer;  // Eager loading

    // Getter and Setter methods
}

এখানে, @ManyToOne(fetch = FetchType.EAGER) এর মাধ্যমে customer সম্পর্কটি Eager লোড হচ্ছে, অর্থাৎ Order Entity লোড হওয়ার সাথে সাথে Customer Entity লোড হবে।


Lazy এবং Eager Fetching এর জন্য Best Practices


1. Lazy Fetching ব্যবহার করুন যখন সম্পর্কিত ডেটার প্রয়োজন না হয়

Lazy Fetching সাধারণত যখন সম্পর্কিত Entity গুলি অপ্রয়োজনীয় হতে পারে তখন ব্যবহার করা উচিত। উদাহরণস্বরূপ, যদি আপনার মূল Entity তে বড় আকারের সম্পর্ক থাকে (যেমন, OneToMany), তবে Lazy Fetching ব্যবহার করা ভালো যাতে একাধিক সম্পর্কের ডেটা ডেটাবেস থেকে অতিরিক্ত লোড না হয়।

Best Practice Example:

@Entity
public class Order {

    @Id
    private Long id;
    private String productName;
    
    @OneToMany(fetch = FetchType.LAZY)
    private List<OrderDetail> orderDetails;  // Lazy loading

    // Getter and Setter methods
}

এখানে, @OneToMany(fetch = FetchType.LAZY) ব্যবহার করা হয়েছে, যাতে যখন Order লোড হয়, তখন OrderDetails ডেটা কেবল তখনই লোড হবে যখন সেগুলি অ্যাক্সেস করা হবে।

2. Eager Fetching ব্যবহার করুন যখন সম্পর্কিত ডেটা সবসময় প্রয়োজন হয়

Eager Fetching ব্যবহার করা উচিত যখন সম্পর্কিত ডেটা সবসময় প্রয়োজন হয় এবং আপনি চান যে Entity লোড হওয়া সাথে সাথে সমস্ত সম্পর্কিত ডেটা লোড হয়ে যায়। এটি Reporting বা Dashboard এর মতো অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত যেখানে সমস্ত সম্পর্কিত ডেটা একসাথে দেখানো হয়।

Best Practice Example:

@Entity
public class Customer {

    @Id
    private Long id;
    private String name;

    @OneToMany(fetch = FetchType.EAGER)
    private List<Order> orders;  // Eager loading as orders are always needed

    // Getter and Setter methods
}

এখানে, @OneToMany(fetch = FetchType.EAGER) ব্যবহার করা হয়েছে যাতে Customer Entity এর সাথে সব Order ডেটাও একসাথে লোড হয়।

3. HQL/JPQL ব্যবহার করে প্রয়োজনীয় ডেটা নিয়ে আসুন

JPA তে JPQL (Java Persistence Query Language) বা HQL (Hibernate Query Language) ব্যবহার করে আপনি ডেটার কিছু নির্দিষ্ট অংশ লোড করতে পারেন। এর মাধ্যমে ডেটা রিট্রিভ করার সময় শুধুমাত্র প্রয়োজনীয় ডেটা লোড করা হয়, যা Lazy Loading এবং Eager Loading এর মধ্যে একটি ভালো সমাধান হতে পারে।

String query = "SELECT o FROM Order o JOIN FETCH o.customer WHERE o.id = :id";
TypedQuery<Order> typedQuery = entityManager.createQuery(query, Order.class);
typedQuery.setParameter("id", orderId);
Order order = typedQuery.getSingleResult();

এখানে, JOIN FETCH ব্যবহার করে, Order Entity এর সাথে Customer Entity এর সমস্ত ডেটা একসাথে লোড করা হয়েছে, যদিও customer সম্পর্কটি Lazy Fetching হতে পারে।

4. Avoid N+1 Selects

N+1 Query Problem হল একটি পরিচিত পারফরম্যান্স ইস্যু যা ঘটে যখন আপনি Lazy Fetching ব্যবহার করছেন, কিন্তু একাধিক সম্পর্কিত Entity লোড করার জন্য ডেটাবেসে অতিরিক্ত রিকোয়েস্ট পাঠানো হয়। এটি সাধারণত Eager Fetching বা JOIN FETCH ব্যবহার করে প্রতিরোধ করা যায়।

Best Practice Example (Avoid N+1):

String query = "SELECT o FROM Order o LEFT JOIN FETCH o.orderDetails";
TypedQuery<Order> typedQuery = entityManager.createQuery(query, Order.class);
List<Order> orders = typedQuery.getResultList();

এখানে, LEFT JOIN FETCH ব্যবহার করে একসাথে Order এবং OrderDetails এর সব ডেটা লোড করা হচ্ছে, যা N+1 Query Problem থেকে মুক্তি দেয়।

5. Use Projections When Possible

Projections ব্যবহার করে আপনি শুধুমাত্র প্রয়োজনীয় ডেটা লোড করতে পারেন, ফলে পারফরম্যান্স উন্নত হয়। আপনি DTO (Data Transfer Object) ব্যবহার করে নির্দিষ্ট ফিল্ড নিয়ে কুয়েরি করতে পারেন।

String query = "SELECT new com.example.dto.OrderDTO(o.id, o.productName) FROM Order o";
TypedQuery<OrderDTO> typedQuery = entityManager.createQuery(query, OrderDTO.class);
List<OrderDTO> orders = typedQuery.getResultList();

এখানে, শুধুমাত্র id এবং productName ফিল্ডগুলোর জন্য কুয়েরি করা হয়েছে, যা পারফরম্যান্স অপ্টিমাইজেশনের জন্য উপকারী।


সারাংশ


  • Lazy Fetching ব্যবহার করা উচিত যখন সম্পর্কিত ডেটা কেবলমাত্র প্রয়োজনে লোড করা হয়, যেমন, একাধিক সম্পর্কের ক্ষেত্রে। এটি ডেটাবেসে অতিরিক্ত কল কমায় এবং পারফরম্যান্স অপ্টিমাইজ করে।
  • Eager Fetching ব্যবহার করা উচিত যখন সম্পর্কিত ডেটা সবসময় প্রয়োজন হয় এবং আপনি চান যে Entity লোড হওয়ার সাথে সাথে সমস্ত সম্পর্কিত ডেটা লোড হয়ে যায়।
  • HQL/JPQL ব্যবহার করে প্রয়োজনীয় ডেটা রিট্রিভ করতে এবং N+1 Query Problem থেকে রক্ষা পেতে JOIN FETCH ব্যবহার করা যেতে পারে।
  • DTO Projection ব্যবহার করে নির্দিষ্ট ফিল্ডগুলো কুয়েরি করতে পারফরম্যান্স উন্নত করা যায়।

Lazy এবং Eager লোডিং কৌশলগুলির সঠিক ব্যবহার আপনার JPA অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্কেলেবিলিটি বাড়াতে সহায়তা করবে।

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

Are you sure to start over?

Loading...