Caching হল এক ধরনের প্রযুক্তি যা অ্যাপ্লিকেশন বা ডেটাবেস সিস্টেমের পারফরম্যান্স উন্নত করতে ব্যবহৃত হয়। NHibernate তে ক্যাশিং ব্যবস্থাপনা দুইটি স্তরের মধ্যে বিভক্ত: First-Level Cache এবং Second-Level Cache। প্রতিটি স্তরের ক্যাশিং ডেটার সংরক্ষণ এবং পুনরুদ্ধারে আলাদা কৌশল ব্যবহার করে, যা সিস্টেমের কার্যকারিতা এবং দ্রুততা বাড়াতে সাহায্য করে।
First-Level Cache (প্রথম স্তরের ক্যাশ)
First-Level Cache হল Session অবজেক্টের সাথে সম্পর্কিত ক্যাশ, যা ডেটাবেস থেকে ডেটা লোড করার পর তা সেশনে সংরক্ষণ করে। এই ক্যাশটি সাধারণত Session স্তরের ক্যাশ হিসেবেই পরিচিত। এটি NHibernate এর একটি ডিফল্ট ফিচার এবং Session এর জীবনকাল পর্যন্ত সক্রিয় থাকে।
Key Features:
- Session Scoped: প্রথম স্তরের ক্যাশ শুধুমাত্র একটি Session এর মধ্যে কাজ করে। অর্থাৎ, এক সেশনের মধ্যে যে সমস্ত অবজেক্ট লোড করা হয়, সেগুলি ওই সেশন থেকে ডেটা পুনরুদ্ধার করার সময় ক্যাশ করা হয়।
- Automatic Caching: যখন আপনি একটি অবজেক্ট প্রথমবার লোড করেন, তা সেশনে ক্যাশ হয়ে যায়। পরবর্তী সময়ে যদি আপনি ঐ একই অবজেক্ট আবার লোড করার চেষ্টা করেন, তখন ডেটাবেসে যেতে না গিয়ে প্রথমবারের লোড হওয়া ক্যাশড অবজেক্টটি সরাসরি ফেরত দেওয়া হয়।
- Session End: যখন সেশনটি বন্ধ হয়, প্রথম স্তরের ক্যাশ পরিষ্কার হয়ে যায়।
উদাহরণ:
using (ISession session = sessionFactory.OpenSession())
{
var employee1 = session.Get<Employee>(1); // DB থেকে লোড হবে
var employee2 = session.Get<Employee>(1); // ক্যাশ থেকে লোড হবে, DB তে যাবে না
}
এখানে, প্রথম employee1 লোড হওয়ার পর, employee2 আবার একই আইডি দিয়ে লোড করার সময় ক্যাশ থেকে সরাসরি ডেটা ফিরে আসবে, ফলে ডেটাবেসের উপর চাপ কমবে।
Second-Level Cache (দ্বিতীয় স্তরের ক্যাশ)
Second-Level Cache হল একটি SessionFactory এর মধ্যে সৃষ্ট ক্যাশ, যা সমস্ত সেশন বা অ্যাপ্লিকেশন স্তরের ক্যাশ হিসেবে কাজ করে। এটি বিভিন্ন সেশনকে একত্রে ক্যাশড ডেটা শেয়ার করার সুযোগ দেয়। যদি কোন ডেটা একবার লোড করা হয়ে থাকে, তবে এটি Second-Level Cache তে সংরক্ষিত থাকে এবং পরবর্তী সময়ে অন্য কোনো সেশন সেই ডেটা পুনরুদ্ধার করতে পারবে।
Key Features:
- SessionFactory Scoped: এটি SessionFactory এর সাথে যুক্ত থাকে, অর্থাৎ একাধিক সেশন একে অপরের ক্যাশড ডেটা ব্যবহার করতে পারে।
- Manual Configuration: Second-Level Cache ব্যবহারের জন্য আপনাকে কনফিগারেশন করতে হবে এবং ক্যাশ প্রোভাইডার নির্বাচন করতে হবে (যেমন EhCache, Redis, ইত্যাদি)।
- Persistent Cache: ক্যাশে ডেটা দীর্ঘস্থায়ী হতে পারে এবং এটি সেশন-লেভেলের ক্যাশের চেয়ে বৃহত্তর পরিসরে ডেটা সঞ্চয় করতে সক্ষম।
উদাহরণ:
using (ISession session1 = sessionFactory.OpenSession())
{
var employee1 = session1.Get<Employee>(1); // DB থেকে লোড হবে
}
using (ISession session2 = sessionFactory.OpenSession())
{
var employee2 = session2.Get<Employee>(1); // সেকেন্ড-লেভেল ক্যাশ থেকে লোড হবে
}
এখানে, প্রথম সেশনটি ডেটাবেস থেকে employee1 লোড করবে, কিন্তু দ্বিতীয় সেশনটি সরাসরি সেকেন্ড-লেভেল ক্যাশ থেকে employee1 পুনরুদ্ধার করবে, ফলে ডেটাবেসে নতুন করে কল করার প্রয়োজন হবে না।
First-Level এবং Second-Level Cache এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | First-Level Cache | Second-Level Cache |
|---|---|---|
| Scope | Session-specific (একটি সেশনের মধ্যে) | Application-wide (একাধিক সেশন শেয়ার করতে পারে) |
| Life Cycle | Session life cycle (সেশন বন্ধ হলে ক্যাশ মুছে যাবে) | SessionFactory life cycle (অ্যাপ্লিকেশন চলাকালীন থাকে) |
| Data Sharing | শুধুমাত্র একটি সেশনের মধ্যে শেয়ার করা যায় | একাধিক সেশন ডেটা শেয়ার করতে পারে |
| Cache Size | ছোট (সাময়িক ডেটা ক্যাশ থাকে) | বড় (লম্বা সময়ের জন্য ডেটা ক্যাশ হয়) |
| Configuration | ডিফল্টভাবে সক্রিয় | কনফিগারেশন প্রয়োজন |
| Eviction | সেশন শেষ হলে ক্যাশ মুছে যায় | ক্যাশ পরিষ্কার করার জন্য নির্দিষ্ট সময় বা নিয়ম প্রয়োজন |
Second-Level Cache এর কনফিগারেশন
Second-Level Cache কনফিগার করতে, আপনাকে কিছু অতিরিক্ত কনফিগারেশন ফাইল ব্যবহার করতে হয়। সাধারণত, EhCache ব্যবহার করা হয় যা একটি জনপ্রিয় ক্যাশ প্রোভাইডার।
hibernate.cfg.xml ফাইলে Second-Level Cache কনফিগারেশন:
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.provider_class">NHibernate.Caches.EhCache.EhCacheProvider, NHibernate.Caches.EhCache</property>
<property name="hibernate.cache.region.factory_class">NHibernate.Caches.EhCache.EhCacheRegionFactory</property>
<property name="hibernate.cache.use_query_cache">true</property>
<property name="hibernate.cache.region_prefix">nhibernate</property>
</session-factory>
</hibernate-configuration>
এখানে, EhCache কে ক্যাশ প্রোভাইডার হিসেবে কনফিগার করা হয়েছে। আপনি চাইলে অন্য ক্যাশ প্রোভাইডারও ব্যবহার করতে পারেন।
সারাংশ
- First-Level Cache: এটি সেশন-বেসড ক্যাশ, যেটি সেশনটি জীবিত থাকা অবস্থায় ডেটা ক্যাশ করে এবং সেশন বন্ধ হলে মুছে যায়।
- Second-Level Cache: এটি সেশন-ফ্যাক্টরি-বেসড ক্যাশ, যেটি একাধিক সেশন শেয়ার করতে পারে এবং দীর্ঘস্থায়ী ক্যাশিং প্রক্রিয়া প্রদান করে।
Read more