Spring ORM Hibernate এবং JPA-এর মাধ্যমে ডেটাবেস অপারেশন সম্পন্ন করে। Hibernate এবং JPA ডেটাবেস পারফরম্যান্স উন্নত করার জন্য Caching ব্যবহার করে। Caching ডেটা সংরক্ষণ করে, যাতে বারবার ডাটাবেস কল না করে দ্রুত রেসপন্স দেওয়া যায়।
Spring ORM এর সাথে Caching ব্যবহারে ডেটাবেস থেকে ফ্রিকোয়েন্ট ডেটা রিট্রাইভ করার খরচ কমে যায়, যা অ্যাপ্লিকেশনের কার্যকারিতা বাড়ায়।
Caching এর ধারণা
Caching হল ডেটার একটি অস্থায়ী স্টোরেজ, যা দ্রুত পুনরুদ্ধারযোগ্য। Hibernate বা JPA-এর ক্ষেত্রে দুটি প্রধান ধরণের Cache ব্যবহৃত হয়:
First-Level Cache (Session Cache)
- Hibernate এর ডিফল্ট Cache।
- প্রতিটি Hibernate সেশনে একবার ব্যবহৃত Entity সেভ থাকে।
- এই Cache স্বয়ংক্রিয় এবং ম্যানুয়াল কনফিগারেশন প্রয়োজন হয় না।
- সেশন শেষে Cache পরিষ্কার হয়ে যায়।
উদাহরণ:
Session session = sessionFactory.openSession();
User user1 = session.get(User.class, 1L); // DB query executed
User user2 = session.get(User.class, 1L); // Cache hit, no DB query
Second-Level Cache
- Hibernate বা JPA সেশন সীমার বাইরে Entity সংরক্ষণ করে।
- পুরো অ্যাপ্লিকেশন জুড়ে Cache ডেটা রিইউজ করা যায়।
- পৃথক কনফিগারেশন প্রয়োজন।
- Cache Framework (EHCache, Redis, Hazelcast) ব্যবহার করে সেটআপ করা হয়।
সুবিধা:
- ডেটাবেস লোড হ্রাস করে।
- ডেটা অ্যাক্সেসের গতি বাড়ায়।
Hibernate Second-Level Cache সেটআপ
Dependency যোগ করা
EHCache Hibernate-এর জন্য সবচেয়ে জনপ্রিয় Cache Framework। নিচে Maven ডিপেন্ডেন্সি দেওয়া হলো:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.6.15.Final</version>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.10.8</version>
</dependency>
Hibernate Configuration
Hibernate Configuration-এ Second-Level Cache সক্রিয় করতে হবে।
import org.hibernate.cache.jcache.ConfigSettings;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HibernateCacheConfig {
@Bean
public Properties hibernateProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.cache.use_second_level_cache", "true");
properties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.jcache.JCacheRegionFactory");
properties.setProperty("hibernate.javax.cache.provider", "org.ehcache.jsr107.EhcacheCachingProvider");
return properties;
}
}
Entity-তে Caching কনফিগারেশন
Hibernate Cache কাজ করার জন্য Entity-তে @Cache অ্যানোটেশন ব্যবহার করা হয়। উদাহরণ:
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters and Setters
}
CacheConcurrencyStrategy এর ধরন
Hibernate Cache-এ Concurrency Strategy গুরুত্বপূর্ণ ভূমিকা পালন করে। বিভিন্ন স্ট্র্যাটেজি নিচে উল্লেখ করা হলো:
READ_ONLY
- শুধুমাত্র পড়ার জন্য Cache।
- ডেটা পরিবর্তনের প্রয়োজন নেই এমন ক্ষেত্রে ব্যবহার হয়।
NONSTRICT_READ_WRITE
- ডেটা পরিবর্তন হতে পারে, তবে সঠিক সিঙ্ক্রোনাইজেশন নিশ্চিত হয় না।
- কম ফ্রিকোয়েন্ট ডেটা অ্যাক্সেসের জন্য।
READ_WRITE
- ডেটা পড়া এবং লেখা উভয়ের জন্য উপযুক্ত।
- সিঙ্ক্রোনাইজড ডেটা অ্যাক্সেস নিশ্চিত করে।
TRANSACTIONAL
- সম্পূর্ণ ট্রানজ্যাকশনাল Cache।
- খুবই সুনির্দিষ্ট এবং নির্ভুল অ্যাপ্লিকেশনের জন্য।
Spring ORM এবং Caching এর সুবিধা
- ডেটাবেস লোড কমায়।
- ডেটা ফেচিং দ্রুত করে।
- মেমরি ব্যবহারে কার্যকর।
- বারবার ডেটা অ্যাক্সেসের সময় রেসপন্স টাইম কমিয়ে আনে।
- বড় অ্যাপ্লিকেশনে পারফরম্যান্স উন্নত করে।
Spring ORM এবং Caching একত্রে ব্যবহারে অ্যাপ্লিকেশন পারফরম্যান্স উল্লেখযোগ্যভাবে বাড়ানো যায়। Cache এর প্রয়োজনীয়তা এবং ডেটার ধরণ অনুযায়ী Lazy Loading এবং Caching স্ট্র্যাটেজি নির্বাচন করা উচিত।
Spring ORM (Object-Relational Mapping) এর মাধ্যমে ডাটাবেস অ্যাক্সেস করার সময় Caching গুরুত্বপূর্ণ ভূমিকা পালন করে। Caching মূলত এমন একটি প্রক্রিয়া যা ডাটাবেস থেকে পুনরাবৃত্ত ডেটা রিট্রিভ করার প্রয়োজনীয়তা কমিয়ে ডাটা অ্যাক্সেসকে দ্রুততর এবং কার্যকর করে তোলে। এটি ORM টুল যেমন Hibernate, JPA-তে ব্যবহৃত হয় এবং Spring ORM এই ফিচারগুলিকে সহজে একীভূত করতে সাহায্য করে।
Caching এর মৌলিক ধারণা
কীভাবে Caching কাজ করে?
Caching হল একটি প্রক্রিয়া যেখানে বারবার ব্যবহৃত ডেটা সাময়িকভাবে মেমোরিতে সংরক্ষণ করা হয়, যাতে পুনরায় ডাটাবেসে কল না করেও ডেটা দ্রুত অ্যাক্সেস করা যায়।
Caching এর প্রয়োজনীয়তা
ডাটাবেস অ্যাক্সেস কমানো
ORM এ প্রতিটি ডেটাবেজ কল সময় ও রিসোর্স খরচ করে। Caching ব্যবহার করলে ডেটা একবার রিট্রিভ হওয়ার পর সেটি মেমোরিতে সংরক্ষণ করা হয়, ফলে ডাটাবেসে অতিরিক্ত কলের প্রয়োজন হয় না।
পারফরম্যান্স বৃদ্ধি
Caching এর মাধ্যমে ডাটাবেস থেকে ডেটা রিট্রিভ করার পরিবর্তে মেমোরি থেকে ডেটা দ্রুত অ্যাক্সেস করা যায়, যা অ্যাপ্লিকেশনের কার্যকারিতা বৃদ্ধি করে।
নেটওয়ার্ক ট্রাফিক কমানো
ডাটাবেসে প্রতি কল নেটওয়ার্ক ট্রাফিক বৃদ্ধি করে। Caching ব্যবহার করলে ডাটাবেস কলের সংখ্যা কমে যায়, ফলে নেটওয়ার্ক ট্রাফিকও হ্রাস পায়।
স্কেলেবিলিটি বৃদ্ধি
Caching ব্যবহার করলে অ্যাপ্লিকেশন বড় ডেটাসেট এবং একাধিক ব্যবহারকারীর জন্য কার্যকরভাবে কাজ করতে পারে।
Hibernate এবং JPA-তে Caching এর ধরন
First-Level Cache
- Hibernate বা JPA এর ডিফল্ট ক্যাশ।
- প্রতিটি Session বা EntityManager-এর সঙ্গে যুক্ত থাকে।
- একই ডেটা একাধিকবার রিট্রিভ হলে, এটি ডাটাবেসে কল না করে ক্যাশ থেকে ডেটা সরবরাহ করে।
Second-Level Cache
- প্রয়োজনীয়ভাবে কনফিগার করতে হয়।
- পুরো অ্যাপ্লিকেশনের জন্য একটি শেয়ার্ড ক্যাশ।
- জনপ্রিয় Second-Level Cache প্রোভাইডার:
- Ehcache
- Infinispan
- Redis
- Hazelcast
Spring ORM এ Caching বাস্তবায়ন
First-Level Cache উদাহরণ
Hibernate Session এর First-Level Cache ডিফল্টভাবেই সক্রিয় থাকে।
Session session = sessionFactory.openSession();
Product product1 = session.get(Product.class, 1); // ডাটাবেস কল হবে
Product product2 = session.get(Product.class, 1); // ক্যাশ থেকে ডেটা আসবে
Second-Level Cache কনফিগারেশন
Hibernate Second-Level Cache সক্রিয় করার জন্য, নিচের ধাপগুলি অনুসরণ করুন:
1. hibernate.cfg.xml ফাইল কনফিগার করুন:
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
2. Entity-তে Caching অ্যানোটেশন যোগ করুন:
import jakarta.persistence.Entity;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {
// ফিল্ড এবং Getter/Setter
}
Caching এর সীমাবদ্ধতা
- ডেটা আপডেট ইস্যু: Cached ডেটা পরিবর্তনের ক্ষেত্রে ডেটা সিঙ্ক্রোনাইজেশনের সমস্যা হতে পারে।
- অতিরিক্ত মেমোরি ব্যবহার: ক্যাশ মেমোরি ব্যবহার করলে অতিরিক্ত RAM প্রয়োজন হতে পারে।
- জটিলতা বৃদ্ধি: Second-Level Cache ব্যবহারের জন্য অতিরিক্ত কনফিগারেশন এবং রক্ষণাবেক্ষণ প্রয়োজন।
কখন Caching ব্যবহার করবেন?
- যখন অ্যাপ্লিকেশনে একই ডেটা বারবার অ্যাক্সেস করা হয়।
- যখন ডাটাবেস কলের সংখ্যা কমিয়ে অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি প্রয়োজন।
- বড় ডেটাসেটের জন্য যেখানে ডেটা রিড-হেভি (read-heavy) অ্যাপ্লিকেশন।
ORM-এ Caching এর প্রয়োগ অ্যাপ্লিকেশনকে দ্রুত, কার্যকর, এবং স্কেলেবল করে তোলে। Spring ORM Hibernate এর মতো শক্তিশালী ORM টুলের সঙ্গে কাজ করায় Caching আরও সহজে বাস্তবায়নযোগ্য।
Hibernate একটি শক্তিশালী ORM টুল যা ডেটাবেস অপারেশনে পারফরম্যান্স উন্নত করার জন্য ক্যাশিং মেকানিজম সরবরাহ করে। Hibernate এ ক্যাশিং দুটি স্তরে কাজ করে:
- First Level Cache: প্রতিটি সেশনের জন্য ডিফল্টভাবে সক্রিয় থাকে।
- Second Level Cache: পুরো অ্যাপ্লিকেশনের জন্য শেয়ারযোগ্য ক্যাশ মেকানিজম।
- Query Cache: Second Level Cache এর উপর ভিত্তি করে নির্দিষ্ট কাস্টম ক্যাশিং।
Hibernate Second Level Cache
Second Level Cache ডেটা সঞ্চালনে একটি শেয়ারযোগ্য ক্যাশ ব্যবস্থাপনা করে যা একাধিক সেশনের জন্য ব্যবহার করা যায়। এটি ডেটাবেসে পুনরাবৃত্তি অপারেশন কমিয়ে অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করে।
প্রতিস্থাপনযোগ্য ক্যাশ প্রোভাইডার:
- Ehcache
- Infinispan
- Redis
- Caffeine
Second Level Cache কনফিগারেশন
Maven ডিপেন্ডেন্সি
Ehcache প্রোভাইডার ব্যবহার করে Second Level Cache কনফিগার করার জন্য Maven ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.6.15.Final</version>
</dependency>
Hibernate Configuration
application.properties ফাইলে Second Level Cache সক্রিয় করুন:
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory
spring.jpa.properties.javax.cache.provider=org.ehcache.jsr107.EhcacheCachingProvider
Entity-Level Configuration
@Cache অ্যানোটেশন ব্যবহার করে Second Level Cache কনফিগার করা হয়:
import jakarta.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "products")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "price")
private Double price;
// Getters and Setters
}
CacheConcurrencyStrategy Options:
READ_ONLY: ডেটা শুধুমাত্র পড়ার জন্য।NONSTRICT_READ_WRITE: অপ্রচলিত ডেটা আপডেট করার অনুমতি।READ_WRITE: পড়া এবং লেখা উভয়ের জন্য সঠিক সমন্বয়।TRANSACTIONAL: সম্পূর্ণ ট্রানজ্যাকশনাল কনসিস্টেন্সি।
Query Cache
Query Cache একটি অতিরিক্ত ক্যাশিং মেকানিজম যা Hibernate এর HQL বা Criteria API এর জন্য ব্যবহৃত হয়। এটি সেকেন্ড লেভেল ক্যাশের ওপর নির্ভরশীল।
Query Cache কনফিগারেশন
Query Cache সক্রিয়করণ
application.properties ফাইলে Query Cache সক্রিয় করুন:
spring.jpa.properties.hibernate.cache.use_query_cache=true
Query Cache ব্যবহার
Query Cache ব্যবহার করতে হলে HQL বা Criteria Query তৈরি করতে হবে এবং সেটি ক্যাশ সক্ষম করতে হবে।
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.stereotype.Repository;
@Repository
public class ProductRepository {
@Autowired
private Session session;
public List<Product> getCachedProducts() {
Query<Product> query = session.createQuery("from Product", Product.class);
query.setCacheable(true); // Enable query caching
return query.list();
}
}
উদাহরণ: Second Level এবং Query Cache কার্যপ্রবাহ
ProductService ক্লাস
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public List<Product> getProducts() {
return productRepository.getCachedProducts();
}
}
Controller
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/products")
public class ProductController {
@Autowired
private ProductService productService;
@GetMapping
public List<Product> getAllProducts() {
return productService.getProducts();
}
}
Hibernate Second Level Cache এবং Query Cache এর সুবিধা
| ক্যাশিং প্রকার | সুবিধা |
|---|---|
| Second Level Cache | ডেটাবেস হিট কমিয়ে দ্রুত ডেটা রিট্রাইভ করে। |
| Query Cache | বারবার এক্সিকিউট করা কুয়েরির ফলাফল ক্যাশ করে। |
Hibernate Second Level এবং Query Cache ব্যবহার করে অ্যাপ্লিকেশনের কার্যক্ষমতা এবং পারফরম্যান্স অনেকাংশে বৃদ্ধি করা সম্ভব।
Spring Cache Integration স্প্রিং ওআরএম (Spring ORM) এর কার্যক্ষমতা বাড়ানোর জন্য একটি গুরুত্বপূর্ণ উপায়। এটি ডাটাবেস কোয়েরির ফলাফলকে ক্যাশে সংরক্ষণ করে পুনরায় কোয়েরি করার প্রয়োজনীয়তা কমায়, যা অ্যাপ্লিকেশনের গতিশীলতা উন্নত করে।
স্প্রিং ক্যাশ (Spring Cache) কী?
Spring Cache হলো একটি অ্যাবস্ট্রাকশন লেয়ার যা ডেটা বা কোয়েরির ফলাফলকে ইন-মেমরি ক্যাশে সংরক্ষণ করে। এটি অ্যাপ্লিকেশনের পারফরম্যান্স বাড়ায় এবং পুনরাবৃত্ত ডেটাবেস অ্যাক্সেস কমায়।
Spring Cache Integration এর গুরুত্বপূর্ণ বৈশিষ্ট্য
- ক্যাশ মেকানিজম: ডাটাবেসে একই কোয়েরি একাধিকবার করার পরিবর্তে ক্যাশে থেকে ডেটা ফেরত দেওয়া হয়।
- ক্যাশ স্টোরেজ: Spring বিভিন্ন ক্যাশ প্রদানকারী যেমন EhCache, Redis, Caffeine, বা SimpleCacheManager সমর্থন করে।
- অটোমেটেড কনফিগারেশন: Spring Boot Cache Starter ক্যাশ সেটআপ সহজ করে।
Spring Cache Integration এর ধাপসমূহ
১. Maven ডিপেনডেন্সি যোগ করা
Spring Boot ব্যবহার করলে Maven pom.xml এ নিম্নলিখিত ডিপেনডেন্সি যোগ করতে হবে:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
প্রয়োজন অনুযায়ী, নির্দিষ্ট ক্যাশ টেকনোলজির জন্য ডিপেনডেন্সি যোগ করুন (যেমন EhCache বা Redis)।
২. @EnableCaching ব্যবহার করে ক্যাশিং সক্রিয় করা
Spring Cache সক্রিয় করতে প্রধান ক্লাসে @EnableCaching অ্যানোটেশন ব্যবহার করতে হবে:
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableCaching
public class SpringOrmCacheApplication {
public static void main(String[] args) {
SpringApplication.run(SpringOrmCacheApplication.class, args);
}
}
৩. ক্যাশিং যোগ করা @Cacheable অ্যানোটেশন ব্যবহার করে
কোনো মেথডে ক্যাশিং প্রয়োগ করতে @Cacheable অ্যানোটেশন ব্যবহার করা হয়। উদাহরণস্বরূপ:
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Cacheable("users")
public User findUserById(Long id) {
// Mock database call
System.out.println("Fetching user from database...");
return new User(id, "John Doe");
}
}
ব্যাখ্যা:
@Cacheable("users"): মেথডের রিটার্ন ভ্যালুকেusersনামক ক্যাশে সংরক্ষণ করে।- প্রথমবার ডেটাবেস থেকে ডেটা নিয়ে আসা হবে এবং পরবর্তী সময়ে ক্যাশ থেকে তা রিটার্ন করা হবে।
৪. ক্যাশ ম্যানেজমেন্ট কাস্টমাইজেশন (অপশনাল)
Spring Boot এর ডিফল্ট SimpleCacheManager ব্যবহার করে। তবে, উন্নত পারফরম্যান্সের জন্য EhCache বা Redis ইন্টিগ্রেট করা যেতে পারে।
EhCache কনফিগারেশন উদাহরণ: ehcache.xml ফাইল তৈরি করুন:
<ehcache>
<cache name="users"
maxEntriesLocalHeap="1000"
timeToLiveSeconds="3600">
</cache>
</ehcache>
Spring Configuration ক্লাসে EhCache যোগ করুন:
import org.springframework.cache.CacheManager;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheManagerFactoryBean().getObject());
}
@Bean
public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
EhCacheManagerFactoryBean factory = new EhCacheManagerFactoryBean();
factory.setConfigLocation(new ClassPathResource("ehcache.xml"));
factory.setShared(true);
return factory;
}
}
Hibernate Second-Level Cache
Spring Cache Integration এর পাশাপাশি Hibernate এর Second-Level Cache ব্যবহার করা ORM পারফরম্যান্স বাড়াতে পারে।
Second-Level Cache সক্রিয় করার জন্য:
application.properties এ কনফিগারেশন যোগ করুন:
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
spring.jpa.properties.hibernate.cache.use_query_cache=true
Hibernate এ Second-Level Cache ক্যাশ প্যারামিটার সংরক্ষণ করে, যা স্প্রিং ক্যাশের সাথে সম্পূর্ণরূপে একীভূত হয়।
সারাংশ
Spring Cache Integration এবং Hibernate Second-Level Cache একত্রে ব্যবহার করলে স্প্রিং ওআরএম এর কার্যক্ষমতা উল্লেখযোগ্যভাবে বৃদ্ধি পায়। ক্যাশিং পদ্ধতিতে ইন-মেমরি ডেটা স্টোরেজ ব্যবহার করে ডেটাবেস অ্যাক্সেসের সময় এবং খরচ কমানো হয়। Redis বা EhCache এর মতো উন্নত ক্যাশ সিস্টেম ব্যবহার করলে আরও উন্নত পারফরম্যান্স নিশ্চিত করা যায়।
ক্যাশিং কি?
Caching হলো ডেটা স্টোর করার একটি মেকানিজম, যা বারবার ডাটাবেজে অ্যাকসেস না করে প্রয়োজনীয় ডেটা দ্রুত সরবরাহ করতে সহায়তা করে। Spring ORM এ Hibernate এর ক্যাশিং মেকানিজম ব্যবহার করে ডাটাবেজ অপারেশনের পারফরম্যান্স বৃদ্ধি করা যায়। Hibernate দুই ধরনের ক্যাশিং সরবরাহ করে:
- First Level Cache: ডিফল্টভাবে সক্রিয় এবং একটি সেশন পর্যন্ত সীমাবদ্ধ।
- Second Level Cache: কনফিগারেশন-ভিত্তিক এবং একাধিক সেশনের মধ্যে শেয়ার করা যায়।
ক্যাশিং এর ধাপ
১. First Level Cache
Hibernate সেশনের লেভেলে স্বয়ংক্রিয়ভাবে কাজ করে। এই ক্যাশিং এর জন্য আলাদা কোনো কনফিগারেশন প্রয়োজন নেই।
২. Second Level Cache
Spring ORM এ Hibernate Second Level Cache ব্যবহার করতে হলে এটি স্পষ্টভাবে কনফিগার করতে হয়। Hibernate বিভিন্ন ক্যাশিং প্রোভাইডার সাপোর্ট করে, যেমন:
- Ehcache
- Redis
- Infinispan
উদাহরণ সহ Second Level Cache ইমপ্লিমেন্টেশন
প্রয়োজনীয় ডিপেনডেন্সি
Maven এর pom.xml ফাইলে Hibernate এবং Ehcache এর ডিপেনডেন্সি যোগ করুন:
<dependencies>
<!-- Hibernate Core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.15.Final</version>
</dependency>
<!-- Hibernate Ehcache -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.6.15.Final</version>
</dependency>
<!-- Spring ORM -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.29</version>
</dependency>
</dependencies>
Hibernate কনফিগারেশন ফাইল
Hibernate এর hibernate.cfg.xml ফাইলে Second Level Cache এর জন্য কনফিগারেশন যোগ করুন:
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/your_database</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<!-- Hibernate properties -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<!-- Enable Second Level Cache -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<property name="hibernate.cache.use_query_cache">true</property>
</session-factory>
</hibernate-configuration>
Ehcache কনফিগারেশন ফাইল
Ehcache এর জন্য ehcache.xml ফাইল তৈরি করুন:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.ehcache.org/ehcache.xsd">
<cache name="com.example.Employee"
maxEntriesLocalHeap="1000"
timeToLiveSeconds="300">
</cache>
</ehcache>
Entity ক্লাস
ক্যাশিং যোগ করার জন্য Entity ক্লাসে @Cache অ্যানোটেশন যোগ করুন:
Employee.java
import jakarta.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
@Id
private int id;
private String name;
private String department;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
DAO ক্লাসে ক্যাশিং পরীক্ষা
EmployeeDAO.java
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import javax.transaction.Transactional;
@Repository
public class EmployeeDAO {
@Autowired
private SessionFactory sessionFactory;
@Transactional
public Employee getEmployeeById(int id) {
Session session = sessionFactory.getCurrentSession();
return session.get(Employee.class, id); // First Level Cache
}
@Transactional
public Employee getEmployeeWithSecondLevelCache(int id) {
Session session = sessionFactory.getCurrentSession();
return session.get(Employee.class, id); // Second Level Cache
}
}
Main ক্লাস
App.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
EmployeeDAO employeeDAO = context.getBean(EmployeeDAO.class);
// First Query (Hits Database)
Employee emp1 = employeeDAO.getEmployeeById(1);
System.out.println("Employee 1: " + emp1.getName());
// Second Query (Uses Cache)
Employee emp2 = employeeDAO.getEmployeeWithSecondLevelCache(1);
System.out.println("Employee 2: " + emp2.getName());
}
}
ক্যাশিং এর সুবিধা এবং সীমাবদ্ধতা
সুবিধা:
- ডাটাবেস লোড কমায়।
- অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করে।
- বারবার ডেটা ফেচিং এ সময় সাশ্রয় করে।
সীমাবদ্ধতা:
- কনফিগারেশন জটিল।
- ক্যাশিং সঠিকভাবে ব্যবস্থাপনা না করলে Stale Data সমস্যার উদ্ভব হতে পারে।
- মেমরি ব্যবহারের জন্য অতিরিক্ত রিসোর্স প্রয়োজন।
Hibernate Second Level Cache এর মাধ্যমে Spring ORM এ কার্যকর ক্যাশিং বাস্তবায়ন করা যায়। Ehcache এর মত ক্যাশিং প্রোভাইডার ব্যবহার করে অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করা সহজ হয়।
Read more