Data Fetching এবং Lazy Loading কনফিগারেশন

iBATIS এর জন্য Performance Optimization Techniques - আইবাটিস (iBATIS) - Java Technologies

313

iBATIS (এখন MyBatis) একটি SQL mapping framework যা Java objects এবং SQL queries-এর মধ্যে সম্পর্ক তৈরি করতে ব্যবহৃত হয়। iBATIS ডেটাবেস থেকে ডেটা ফেচ (fetching) এবং lazy loading কনফিগার করতে সক্ষম। এখানে আমরা আলোচনা করব কিভাবে data fetching এবং lazy loading কনফিগার করা যায় iBATIS (MyBatis) এর মাধ্যমে।


1. Data Fetching in iBATIS

Data fetching হল ডেটাবেস থেকে তথ্য নির্বাচন বা রিট্রিভ করার প্রক্রিয়া। iBATIS-এ, ডেটা ফেচিং করতে আমরা SQL mapping ফাইল ব্যবহার করি, যেখানে SQL কুয়েরি তৈরি করা হয় এবং সেটি parameterized queries হিসেবে ব্যবহৃত হয়।

iBATIS-এ ডেটা ফেচ করার জন্য, সাধারণত select কুয়েরি ব্যবহার করা হয়। এই কুয়েরি গুলি SQL Mapping File-এ select ট্যাগে নির্ধারিত হয়।

Basic Data Fetching Example in iBATIS

1. SQL Mapping File (User.xml):

<sqlMap namespace="User">
    <!-- Select query to fetch user by ID -->
    <select id="getUserById" parameterClass="int" resultClass="User">
        SELECT id, name, email FROM users WHERE id = #id#
    </select>
    
    <!-- Select query to fetch all users -->
    <select id="getAllUsers" resultClass="User">
        SELECT id, name, email FROM users
    </select>
</sqlMap>

ব্যাখ্যা:

  • getUserById: এটি একটি SQL কুয়েরি যা id দিয়ে নির্দিষ্ট ব্যবহারকারীকে রিটার্ন করবে।
  • getAllUsers: এটি একটি SQL কুয়েরি যা সমস্ত users রিটার্ন করবে।

Java Code to Fetch Data (Main.java):

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Main {
    public static void main(String[] args) {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(Main.class.getResourceAsStream("/SqlMapConfig.xml"));

        try (SqlSession session = sqlSessionFactory.openSession()) {
            // Fetch user by ID
            User user = session.selectOne("User.getUserById", 1);
            System.out.println("User Name: " + user.getName());

            // Fetch all users
            List<User> users = session.selectList("User.getAllUsers");
            for (User u : users) {
                System.out.println("User Name: " + u.getName());
            }
        }
    }
}

ব্যাখ্যা:

  • session.selectOne("User.getUserById", 1) - এটি প্রথম SQL কুয়েরি ব্যবহার করে ID ১ দিয়ে একটি ব্যবহারকারী রিটার্ন করে।
  • session.selectList("User.getAllUsers") - এটি সমস্ত ব্যবহারকারী রিটার্ন করে।

2. Lazy Loading in iBATIS (MyBatis)

Lazy Loading হল একটি কৌশল যেখানে সম্পর্কিত ডেটা শুধুমাত্র তখনই লোড করা হয় যখন তা প্রয়োজন হয়, অর্থাৎ ডেটাবেসের সাথে সম্পর্কিত ডেটা কেবল তখনই লোড হবে যখন আপনি তা এক্সেস করবেন। iBATIS (MyBatis) lazy loading কনফিগারেশন সমর্থন করে, এবং এটি ডেটা ফেচিং পারফরম্যান্স উন্নত করতে সহায়ক হতে পারে।

iBATIS-এ lazy loading কনফিগার করতে, আপনাকে association এবং collection এর জন্য lazy loading সক্রিয় করতে হয়।

Lazy Loading কনফিগারেশন Example

1. Enable Lazy Loading in MyBatis Configuration (mybatis-config.xml):

<configuration>
    <settings>
        <!-- Enable Lazy Loading -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- Optional: Enable Aggressive Lazy Loading (Load nested associations automatically) -->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>
</configuration>

ব্যাখ্যা:

  • lazyLoadingEnabled="true": এটি iBATIS-এর lazy loading সক্রিয় করে। এর মানে হল যে, সম্পর্কিত ডেটা শুধুমাত্র তখনই লোড হবে যখন তা প্রয়োজন হবে।
  • aggressiveLazyLoading="false": এটি aggressive lazy loading নিষ্ক্রিয় করে, যাতে nested association শুধুমাত্র প্রয়োজনে লোড হয়।

2. SQL Mapping File with Lazy Loading (User.xml)

<sqlMap namespace="User">
    <!-- Define Lazy Loading for Address -->
    <resultMap id="userResultMap" class="User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="email" column="email"/>
        
        <!-- Lazy load the associated address -->
        <association property="address" column="address_id" select="Address.getAddressById" fetchType="lazy"/>
    </resultMap>

    <!-- Select query to fetch user by ID with lazy loaded address -->
    <select id="getUserById" parameterClass="int" resultMap="userResultMap">
        SELECT id, name, email, address_id FROM users WHERE id = #id#
    </select>
</sqlMap>

ব্যাখ্যা:

  • Lazy loading for Address: এখানে, address property কে lazy load করা হয়েছে। এর মানে হল যে, যখন User এর address property প্রথমবার এক্সেস করা হবে, তখনই Address টেবিলের জন্য SQL কোয়েরি চালানো হবে।
  • fetchType="lazy" নির্দেশ করে যে, address সম্পর্কিত ডেটা lazy load হবে।

3. Address Mapping File (Address.xml)

<sqlMap namespace="Address">
    <!-- Select query to get Address by ID -->
    <select id="getAddressById" parameterClass="int" resultClass="Address">
        SELECT id, street, city FROM addresses WHERE id = #id#
    </select>
</sqlMap>

ব্যাখ্যা:

  • Address.xml ফাইলের মাধ্যমে Address entity এর জন্য SQL query তৈরি করা হয়েছে, যা User entity এর address_id এর ভিত্তিতে Address রিটার্ন করবে।

4. Example Code with Lazy Loading (Main.java)

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Main {
    public static void main(String[] args) {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(Main.class.getResourceAsStream("/mybatis-config.xml"));

        try (SqlSession session = sqlSessionFactory.openSession()) {
            // Fetch user by ID with lazy loaded address
            User user = session.selectOne("User.getUserById", 1);
            System.out.println("User Name: " + user.getName());
            
            // Lazy loading of address will happen here when accessed
            System.out.println("User Address: " + user.getAddress().getStreet());
        }
    }
}

ব্যাখ্যা:

  • user.getAddress().getStreet() কল করার সময়, lazy loading এর মাধ্যমে Address ডেটা ডেটাবেস থেকে লোড হবে।
  • প্রথমবার address property এক্সেস না করলে, ডেটাবেসে Address এর জন্য কোনো কোয়েরি চালানো হবে না।

5. Benefits of Lazy Loading in iBATIS

  1. Improved Performance:
    • Lazy loading এর মাধ্যমে আপনি শুধুমাত্র তখনই সম্পর্কিত ডেটা লোড করবেন যখন তা প্রয়োজন হয়। এর ফলে আপনার অ্যাপ্লিকেশনটি অপ্রয়োজনীয় ডেটা লোড করার থেকে রক্ষা পায় এবং পারফরম্যান্স উন্নত হয়।
  2. Reduced Memory Consumption:
    • Lazy loading আপনার অ্যাপ্লিকেশনকে কেবলমাত্র প্রয়োজনীয় ডেটা লোড করতে দেয়, যা মেমরি ব্যবহারের পরিমাণ কমিয়ে আনে।
  3. On-Demand Data Fetching:
    • Lazy loading ডেটাকে on-demand ফেচ করতে সক্ষম করে, অর্থাৎ ডেটা তখনই লোড হয় যখন ইউজার বা অ্যাপ্লিকেশন সেটি এক্সেস করে।

6. Best Practices for Lazy Loading in iBATIS

  1. Enable Lazy Loading Carefully:
    • Lazy loading সক্রিয় করার সময়, এটি নিশ্চিত করুন যে আপনি শুধুমাত্র সেই ক্ষেত্রগুলির জন্য এটি ব্যবহার করছেন যেখানে on-demand loading প্রয়োজন।
  2. Avoid Lazy Loading for Large Collections:
    • খুব বড় collections বা সম্পর্কগুলির জন্য lazy loading ব্যবহার করলে এটি ডেটাবেসে অতিরিক্ত কোয়েরি পাঠাতে পারে, যা অ্যাপ্লিকেশনের পারফরম্যান্সে নেতিবাচক প্রভাব ফেলতে পারে। এই ক্ষেত্রে eager loading ব্যবহার করা উচিত।
  3. Use Caching Effectively:
    • Lazy loading সঠিকভাবে কাজ করার জন্য, second-level caching ব্যবহার করা ভাল। এটি আপনার অ্যাপ্লিকেশনকে দ্রুত ডেটা ফিরিয়ে দিতে সহায়ক হবে এবং পারফরম্যান্সে উন্নতি করবে।

iBATIS (MyBatis)data fetching এবং lazy loading কনফিগার করা সহজ এবং কার্যকর। Lazy loading ব্যবহার করার মাধ্যমে, আপনি ডেটাবেসে প্রয়োজনীয় ডেটা শুধুমাত্র তখনই লোড করবেন যখন তা প্রয়োজন হবে, যা আপনার অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে সহায়ক হবে। iBATIS এর মাধ্যমে one-to-one বা one-to-many সম্পর্কের জন্য lazy loading কনফিগার করা সহজ, এবং আপনি SQL mapping ফাইলের মাধ্যমে সম্পর্কিত ডেটা লোড করার জন্য প্রয়োজনীয় কোড লিখতে পারবেন।

Content added By
Promotion

Are you sure to start over?

Loading...