iBATIS এ First-level এবং Second-level Caching

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

386

iBATIS (এখন MyBatis) একটি SQL mapping framework যা Java objects এবং SQL queries এর মধ্যে সম্পর্ক স্থাপন করতে ব্যবহৃত হয়। iBATIS ডেটাবেস অপারেশনগুলির জন্য caching সুবিধা সরবরাহ করে, যার মাধ্যমে পারফরম্যান্স উন্নত করা যায়। Caching হল এমন একটি প্রযুক্তি যা গতিক্রমে তথ্য সংরক্ষণ করে, যাতে পরবর্তী সময়ে একই ডেটার জন্য পুনরায় ডেটাবেসে পৌঁছানো না লাগে।

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

  1. First-level Cache (Session Cache)
  2. Second-level Cache (Global Cache)

1. iBATIS First-level Cache (Session Cache)

First-level cache হল session-based cache, যা ডিফল্টভাবে iBATIS তে সক্রিয় থাকে। এটি ব্যবহারকারী সেশনের মধ্যে থাকে এবং session এর মধ্যে প্রাপ্ত সব ফলাফল (অর্থাৎ select কুয়েরি থেকে পাওয়া তথ্য) ক্যাশে সংরক্ষণ করা হয়। এটি transactional এবং session-scoped ক্যাশিং, যার মানে হল যে, যখন আপনি একটি SqlSession খুলবেন, তখন আপনার সেই সেশনের মধ্যে ক্যাশ করা ডেটা ব্যবহার করা হবে।

First-level Cache এর বৈশিষ্ট্য:

  • Scope: এটি SqlSession এর মধ্যে থাকে এবং এক সেশন থেকে অন্য সেশনে ডেটা শেয়ার করা হয় না।
  • Automatic: iBATIS দ্বারা প্রথম স্তরের ক্যাশিং সরাসরি সক্রিয় থাকে এবং এটি কোনো কনফিগারেশন ছাড়াই কাজ করে।
  • Transaction-Specific: সেশনটি শেষ হলে ক্যাশের সমস্ত তথ্য ফ্রি হয়ে যায়, তাই পরবর্তী সেশনে একই তথ্য পেতে আবার ডেটাবেসে কল করতে হবে।

First-level Cache Example:

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Main.class.getResourceAsStream("/SqlMapConfig.xml"));
try (SqlSession session = sqlSessionFactory.openSession()) {
    // First Query - Cached
    User user1 = session.selectOne("User.getUserById", 1);
    System.out.println(user1.getName());

    // Second Query - Cached result from first query
    User user2 = session.selectOne("User.getUserById", 1); 
    System.out.println(user2.getName());
}

ব্যাখ্যা:

  • প্রথমবার selectOne কুয়েরি চালানোর সময়, ডেটাবেস থেকে তথ্য নেয়া হয় এবং ক্যাশে রাখা হয়।
  • পরবর্তী সময়ে একই কুয়েরি চালালে, ক্যাশে থাকা তথ্য সরাসরি ফেরত আসবে, ডেটাবেস থেকে নতুনভাবে কল করার প্রয়োজন নেই।

2. iBATIS Second-level Cache (Global Cache)

Second-level cache হল একটি global cache, যা SqlSessionFactory বা session factory এর বাইরে থাকে এবং সমস্ত সেশনের মধ্যে শেয়ার করা হয়। এটি global level তে ক্যাশিং সক্ষম করে, যাতে একাধিক সেশন একই ডেটা ক্যাশে শেয়ার করতে পারে। এটি entity-level ক্যাশিং, যা আপনাকে session এর বাইরে ক্যাশিং সেট করতে দেয়।

Second-level Cache এর বৈশিষ্ট্য:

  • Scope: এটি SqlSessionFactory এর মধ্যে থাকে এবং session এর বাইরে অন্যান্য সেশনেও শেয়ার করা যায়।
  • Manual Configuration: এটি সক্রিয় করার জন্য কিছু অতিরিক্ত কনফিগারেশন প্রয়োজন।
  • Cache Eviction: Second-level cache এর মধ্যে থাকা তথ্যকে eviction policies এর মাধ্যমে নিয়ন্ত্রণ করা যায়, যেমন ডেটার মেয়াদ শেষ হলে তথ্য স্বয়ংক্রিয়ভাবে মুছে যাবে।

Second-level Cache Configuration:

1. Enable Second-level Cache in MyBatis Configuration File:

<configuration>
    <settings>
        <!-- Enable second-level cache -->
        <setting name="cacheEnabled" value="true"/>
    </settings>

    <mappers>
        <mapper resource="User.xml"/>
    </mappers>
</configuration>

2. SQL Mapping File (User.xml) with Cache Configuration:

<sqlMap namespace="User">
    <cache/>
    
    <!-- Select Query: Get a user by ID -->
    <select id="getUserById" parameterClass="int" resultClass="User">
        SELECT id, name, email FROM users WHERE id = #id#
    </select>
</sqlMap>

ব্যাখ্যা:

  • cache ট্যাগটি User.xml এর মধ্যে যুক্ত করা হয়েছে, যা User entity এর জন্য second-level cache সক্রিয় করবে।
  • <cache/> ব্যবহার করার মাধ্যমে, iBATIS নির্দিষ্ট SQL statements এর জন্য second-level cache সক্রিয় করা হয়।

Second-level Cache with an Example:

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Main.class.getResourceAsStream("/SqlMapConfig.xml"));
try (SqlSession session1 = sqlSessionFactory.openSession()) {
    User user1 = session1.selectOne("User.getUserById", 1);
    System.out.println(user1.getName());
    
    // Second session using second-level cache
    try (SqlSession session2 = sqlSessionFactory.openSession()) {
        User user2 = session2.selectOne("User.getUserById", 1); 
        System.out.println(user2.getName());
    }
}

ব্যাখ্যা:

  • প্রথম সেশনটির মাধ্যমে selectOne কুয়েরি চালানোর পর, ডেটা second-level cache এ সংরক্ষিত হয়।
  • দ্বিতীয় সেশনে, সেই একই ডেটা second-level cache থেকে সরাসরি ফেরত আসে, ডেটাবেসে পুনরায় কল করার প্রয়োজন হয় না।

3. Second-level Cache Settings

iBATIS (MyBatis) এর second-level cache কনফিগারেশন এর জন্য কিছু অতিরিক্ত অপশন রয়েছে যা আপনার ক্যাশ ব্যবস্থাপনা উন্নত করতে সাহায্য করে:

a. Cache Timeout:

<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true" blocking="false"/>

ব্যাখ্যা:

  • eviction: Cache eviction policy নির্ধারণ করে (যেমন LRU, FIFO, NONE)।
  • flushInterval: কত সময় পর ক্যাশটি ফ্লাশ হবে (এটি মিলিসেকেন্ডে দেওয়া হয়)।
  • size: ক্যাশের সর্বাধিক আকার (কতগুলো এন্ট্রি ক্যাশে থাকতে পারে)।
  • readOnly: ক্যাশের ডেটা শুধুমাত্র পড়ার জন্য অনুমোদিত।
  • blocking: যদি ক্যাশটি পূর্ণ হয়, তাহলে নতুন ডেটা অ্যাড করার জন্য অপেক্ষা করবে কিনা তা নির্ধারণ করে।

4. Best Practices for Caching in iBATIS

  1. Enable Second-level Cache Only When Needed:
    • দ্বিতীয় স্তরের ক্যাশ ব্যবহার করার আগে নিশ্চিত করুন যে এটি আপনার অ্যাপ্লিকেশনের পারফরম্যান্সে সহায়ক হবে এবং ডেটার পরিবর্তন (write-heavy operations) কম হবে।
  2. Eviction Policy:
    • ক্যাশের eviction policy যেমন LRU (Least Recently Used) ব্যবহার করা যেতে পারে যাতে পুরনো ডেটা স্বয়ংক্রিয়ভাবে মুছে যায়।
  3. Use Cache for Read-Heavy Operations:
    • আপনি যেসব ডেটা বারবার পড়ছেন, সেগুলোর জন্য second-level cache ব্যবহার করা সবচেয়ে কার্যকর হবে, যেমন লুকআপ টেবিল বা কনফিগারেশন ডেটা।
  4. Cache for Frequently Accessed Data:
    • যেসব ডেটা একাধিক সেশনে বা অনেকবার এক্সেস হয়, তাদের জন্য ক্যাশ ব্যবহার করুন। তবে, ক্যাশের আকার এবং memory usage মনিটর করুন।

iBATIS (MyBatis)first-level এবং second-level ক্যাশিং গুরুত্বপূর্ণ ভূমিকা পালন করে পারফরম্যান্স উন্নত করতে। First-level cache একটি session-scoped cache হিসেবে কাজ করে, যেখানে একটি সেশনে ডেটা ক্যাশ থাকে এবং second-level cache global-level cache হিসেবে কাজ করে, যা একাধিক সেশনের মধ্যে ডেটা শেয়ার করতে পারে। iBATIS-এ ক্যাশিং ব্যবহারের মাধ্যমে ডেটাবেসের প্রতি রাউন্ড-ট্রিপ কমানো সম্ভব হয় এবং অ্যাপ্লিকেশনটির পারফরম্যান্স উন্নত হয়।

অতএব, ক্যাশিং সিস্টেম ব্যবহারের সময় ক্যাশের আকার এবং eviction policies সঠিকভাবে কনফিগার করা অত্যন্ত গুরুত্বপূর্ণ।

Content added By
Promotion

Are you sure to start over?

Loading...