Cache Configuration এবং Cache Models

Caching এবং Performance Optimization - আইবাটিস (iBATIS) - Java Technologies

379

iBATIS (বর্তমানে MyBatis) একটি SQL mapping framework যা Java applications-এ SQL queries এবং Java objects এর মধ্যে সম্পর্ক স্থাপন করে। Caching iBATIS/MyBatis-এ পারফরম্যান্স অপটিমাইজেশন করার একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা ডেটাবেসে একাধিক বার একই query চালানোর পরিবর্তে cached query results পুনরায় ব্যবহার করতে সহায়তা করে।

iBATIS/MyBatis-এ ক্যাশিং ব্যবহারের মাধ্যমে, আপনি SQL query results এবং Java objects কম সময়ের মধ্যে পুনরায় অ্যাক্সেস করতে পারেন, যা ডেটাবেসের প্রতি অপ্রয়োজনীয় লোড কমায় এবং অ্যাপ্লিকেশন পারফরম্যান্সে উল্লেখযোগ্য উন্নতি করে।

এই গাইডে আমরা MyBatis cache configuration এবং cache models সম্পর্কে বিস্তারিত আলোচনা করব।


1. Cache Models in MyBatis

MyBatis-এ সাধারণত দুটি ধরনের ক্যাশ ব্যবহৃত হয়:

  1. First-level Cache (Local Cache):
    • First-level cache স্বয়ংক্রিয়ভাবে কার্যকর এবং এটি session scope-এর মধ্যে কাজ করে। এটি SqlSession এর মধ্যে সব তথ্য ক্যাশ করে রাখে এবং যতক্ষণ session সক্রিয় থাকে, তথ্যের পুনরুদ্ধার ক্যাশ থেকে করা হয়।
    • এটি automatic এবং আপনি ক্যাশটি ম্যানুয়ালি কনফিগার করতে বা বন্ধ করতে পারেন না।
    • First-level cache শুধুমাত্র current session এর মধ্যে কাজ করে এবং session close হওয়ার পর এটি clear হয়ে যায়।
  2. Second-level Cache (Global Cache):
    • Second-level cache একটি global cache যা SqlSessionFactory এর মধ্যে কাজ করে এবং এটি multiple sessions-এর মধ্যে শেয়ার করা যেতে পারে।
    • Second-level cache ব্যবহারকারীদের কনফিগারেশন ফাইলের মাধ্যমে সক্রিয় করতে হয় এবং এটি সাধারণত external cache providers (যেমন EHCache, Redis, Infinispan) এর সাথে কাজ করে।

2. First-level Cache

First-level cache হচ্ছে MyBatis-এ ডিফল্ট ক্যাশ, যা একটি SqlSession এর মধ্যে কার্যকর। যখন আপনি একটি SQL query চালান, MyBatis সেই query result-টিকে প্রথমে ক্যাশে রেখে দেয়। যদি আপনি আবার একই query চালান, তখন MyBatis ক্যাশ থেকে ফলাফল তুলে দেয়, যা ডেটাবেসে নতুন করে query করার চেয়ে দ্রুত।

First-level Cache Example:

SqlSession sqlSession = sqlSessionFactory.openSession();
try {
    // First query execution, data fetched from the database
    Employee employee1 = sqlSession.selectOne("getEmployeeById", 1);

    // Second query execution, same employee, but fetched from the first-level cache
    Employee employee2 = sqlSession.selectOne("getEmployeeById", 1);

    // Both the queries will be cached
    System.out.println(employee1 == employee2);  // Output will be true
} finally {
    sqlSession.close();
}

Explanation:

  • প্রথমবার selectOne query চালানো হলে, MyBatis employee1 কে database থেকে ফেচ করে এবং cache এ সেভ করে।
  • পরবর্তী selectOne query একই id দিয়ে চালানোর পর, MyBatis সরাসরি cache থেকে ডেটা রিটার্ন করবে, ডেটাবেসে গিয়ে query করবে না।

3. Second-level Cache Configuration

Second-level cache ডেটাবেসের বাইরে SQL result এবং Java objects ক্যাশে রাখতে সাহায্য করে, যা multiple sessions এর মধ্যে শেয়ার করা যেতে পারে। এটি আপনাকে ডেটাবেসে পুনরায় একই query চালানোর পরিবর্তে ক্যাশ থেকে ডেটা পুনরুদ্ধার করতে সাহায্য করে।

Enabling Second-level Cache in MyBatis

  1. Configuration File: প্রথমে MyBatis configuration ফাইলে second-level cache চালু করতে হবে।
MyBatis Configuration Example:
<configuration>
    <settings>
        <!-- Enable Second-level cache -->
        <setting name="cacheEnabled" value="true"/>
    </settings>

    <mappers>
        <mapper resource="com/example/EmployeeMapper.xml"/>
    </mappers>
</configuration>
  • <setting name="cacheEnabled" value="true"/>: এটি second-level cache কে সক্রিয় করে।
  1. Mapper Configuration: এরপর, mapper XML file-এ cache configuration যুক্ত করতে হবে।
Mapper XML Example with Cache:
<mapper namespace="com.example.EmployeeMapper">
    <!-- Enable Second-level Cache for this mapper -->
    <cache eviction="LRU" flushInterval="60000" size="512" readOnly="false"/>

    <select id="getEmployeeById" resultType="Employee">
        SELECT * FROM employee WHERE id = #{id}
    </select>
</mapper>

Cache Settings Explanation:

  • <cache>: এটি second-level cache এর জন্য কনফিগারেশন।
    • eviction="LRU": Least Recently Used eviction policy, যেখানে ক্যাশের স্থান শেষ হলে পুরানো ডেটা সরিয়ে দেয়া হয়।
    • flushInterval="60000": এটি ক্যাশ flush (clear) করার সময় নির্ধারণ করে (milliseconds)।
    • size="512": ক্যাশের মেমরি সাইজ সীমিত করা হয়েছে।
    • readOnly="false": এটি নির্ধারণ করে যে ক্যাশটি শুধু read করা যাবে না, write করা যাবে।

Using the Second-level Cache:

SqlSession sqlSession = sqlSessionFactory.openSession();
try {
    // First query execution, data fetched from the database
    Employee employee1 = sqlSession.selectOne("getEmployeeById", 1);

    // Second query execution, same employee, but fetched from the second-level cache
    Employee employee2 = sqlSession.selectOne("getEmployeeById", 1);

    // Both the queries will be cached and fetched from second-level cache
    System.out.println(employee1 == employee2);  // Output will be true
} finally {
    sqlSession.close();
}

Explanation:

  • প্রথম selectOne query চালানো হলে, MyBatis second-level cache-এ ফলাফল রাখবে।
  • পরবর্তী selectOne query একই id দিয়ে চালানোর পর, MyBatis সরাসরি second-level cache থেকে ডেটা রিটার্ন করবে, ডেটাবেসে গিয়ে query করবে না।

4. Cache Providers in MyBatis

MyBatis বিভিন্ন cache providers ব্যবহার করতে সক্ষম, যেমন EHCache, Redis, Infinispan ইত্যাদি। আপনি second-level cache এর জন্য একটি external cache provider নির্বাচন করতে পারেন।

EHCache Example:

MyBatis Configuration with EHCache:
<configuration>
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>

    <mappers>
        <mapper resource="com/example/EmployeeMapper.xml"/>
    </mappers>

    <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
</configuration>
EHCache Configuration File (ehcache.xml):
<ehcache>
    <cache name="employeeCache"
           maxEntriesLocalHeap="1000"
           eternal="false"
           timeToLiveSeconds="3600"
           timeToIdleSeconds="600"
           overflowToDisk="false"/>
</ehcache>

Explanation:

  • <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>: এটি EHCache ব্যবহার করার জন্য কনফিগারেশন।
  • EHCache configuration file: এতে maxEntriesLocalHeap, timeToLiveSeconds, এবং timeToIdleSeconds সেট করা হয়।

5. Cache Eviction Strategies

MyBatis-এ ক্যাশে থাকা ডেটা কিভাবে evict (clear) হবে তা বিভিন্ন eviction strategies দ্বারা নিয়ন্ত্রণ করা যায়। সাধারণভাবে ব্যবহৃত eviction strategies হল:

  1. LRU (Least Recently Used): ক্যাশে যতগুলো আইটেম থাকবে, তার মধ্যে সবচেয়ে কম ব্যবহার করা আইটেমগুলো প্রথমে evict করা হয়।
  2. FIFO (First In First Out): পুরানো আইটেমগুলো প্রথমে evict করা হয়।
  3. Timed Expiry: একটি নির্দিষ্ট সময় পর ক্যাশের ডেটা স্বয়ংক্রিয়ভাবে flush বা evict হয়ে যায়।

  • First-level cache MyBatis-এ SqlSession এর মধ্যে ডেটা ক্যাশ করে এবং second-level cache একাধিক SqlSession এর মধ্যে ডেটা শেয়ার করে, যা global cache হিসাবে কাজ করে।
  • MyBatis-এ cache configuration অত্যন্ত কাস্টমাইজযোগ্য, যেখানে আপনি caching provider এবং eviction strategy নিয়ন্ত্রণ করতে পারেন।
  • EHCache, Redis, এবং Infinispan এর মতো external cache providers ব্যবহার করে second-level cache এর কার্যকারিতা আরও উন্নত করা যেতে পারে।
  • Cache management এবং cache invalidation সঠিকভাবে কনফিগার করা পারফরম্যান্স অপটিমাইজেশনের জন্য গুরুত্বপূর্ণ, বিশেষ করে যখন অ্যাপ্লিকেশনে বেশি ডেটাবেস রিড-অপারেশন থাকে।
Content added By
Promotion

Are you sure to start over?

Loading...