Hibernate ক্যাশিং এমন একটি পদ্ধতি, যা ডাটাবেসে বারবার একই ডেটা রিকোয়েস্ট করা এড়িয়ে পারফরম্যান্স উন্নত করে। Hibernate দুই স্তরের ক্যাশিং মেকানিজম প্রদান করে: First Level Cache এবং Second Level Cache।
First Level Cache Hibernate এর ডিফল্ট ক্যাশিং স্তর, যা প্রতিটি Session
এর সঙ্গে সম্পর্কিত। এটি শুধুমাত্র সেশন স্কোপের মধ্যে কাজ করে এবং স্বয়ংক্রিয়ভাবে অ্যাপ্লিকেশনে অন্তর্ভুক্ত থাকে।
Session session = sessionFactory.openSession();
session.beginTransaction();
// প্রথমবার অবজেক্ট ফেচ করবে ডাটাবেস থেকে
Employee employee1 = session.get(Employee.class, 1L);
System.out.println(employee1.getName());
// দ্বিতীয়বার একই অবজেক্ট সেশন ক্যাশ থেকে ফেচ হবে
Employee employee2 = session.get(Employee.class, 1L);
System.out.println(employee2.getName());
session.getTransaction().commit();
session.close();
Second Level Cache Hibernate এর একটি ঐচ্ছিক ক্যাশিং স্তর, যা সেশন ফ্যাক্টরি-স্কোপড। এটি একাধিক সেশনের মধ্যে ডেটা শেয়ার করতে পারে এবং পারফরম্যান্স আরও উন্নত করে।
Hibernate Second Level Cache ব্যবহার করতে নিম্নলিখিত ধাপগুলো অনুসরণ করতে হয়:
pom.xml
ফাইলে EhCache এর জন্য ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>6.2.6.Final</version>
</dependency>
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 ক্লাসে @Cache
এনোটেশন ব্যবহার করুন:
import jakarta.persistence.*;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
বৈশিষ্ট্য | First Level Cache | Second Level Cache |
---|---|---|
স্কোপ | সেশন-স্কোপড | সেশন ফ্যাক্টরি-স্কোপড |
ডিফল্ট স্টেট | ডিফল্টভাবে সক্রিয় | কনফিগারেশন প্রয়োজন |
ডেটা শেয়ারিং | একক সেশনের মধ্যে সীমাবদ্ধ | একাধিক সেশনের মধ্যে ডেটা শেয়ার |
কাস্টমাইজেশন | কাস্টমাইজেশন সম্ভব নয় | বিভিন্ন ক্যাশিং ফ্রেমওয়ার্ক ব্যবহৃত |
পারফরম্যান্স | সেশনভিত্তিক ডেটা ফেচ উন্নত করে | ডাটাবেস লোড কমিয়ে পারফরম্যান্স উন্নত করে |
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
public Employee getEmployeeById(Long id) {
// প্রথমবার ডেটা ডাটাবেস থেকে আনবে
return employeeRepository.findById(id).orElseThrow(() -> new RuntimeException("Employee not found"));
}
public Employee getEmployeeFromCache(Long id) {
// দ্বিতীয়বার ডেটা ক্যাশ থেকে আনবে (Second Level Cache)
return employeeRepository.findById(id).orElseThrow(() -> new RuntimeException("Employee not found"));
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/employees")
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@GetMapping("/{id}")
public Employee getEmployee(@PathVariable Long id) {
return employeeService.getEmployeeById(id);
}
@GetMapping("/cache/{id}")
public Employee getEmployeeFromCache(@PathVariable Long id) {
return employeeService.getEmployeeFromCache(id);
}
}
Hibernate ক্যাশিং সিস্টেম অ্যাপ্লিকেশনের ডেটাবেস কার্যকারিতা উন্নত করতে গুরুত্বপূর্ণ ভূমিকা পালন করে। First Level Cache সেশনভিত্তিক এবং ডিফল্টভাবে সক্রিয়, যেখানে Second Level Cache একাধিক সেশনের মধ্যে ডেটা শেয়ার করতে পারে এবং কনফিগারেশন প্রয়োজন। Second Level Cache ব্যবহার করে ডেটাবেস লোড উল্লেখযোগ্যভাবে কমানো যায় এবং অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করা যায়।
Caching হলো এমন একটি প্রক্রিয়া যেখানে ডেটা বা অবজেক্টকে ডাটাবেস থেকে পুনরায় লোড করার পরিবর্তে মেমোরিতে রাখা হয়। এটি অ্যাপ্লিকেশন পারফরম্যান্স বাড়াতে এবং ডাটাবেসের লোড কমাতে সাহায্য করে। Hibernate-এ, ক্যাশিং একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা ডেটাবেসে বারবার কুয়েরি চালানোর পরিবর্তে ডেটা দ্রুত সরবরাহ করতে সহায়তা করে।
Caching সিস্টেম সাধারণত অ্যাপ্লিকেশন এবং ডাটাবেসের মধ্যে একটি মধ্যস্থ লেয়ার হিসেবে কাজ করে। এটি ডেটা সংরক্ষণ করে এবং প্রয়োজন অনুযায়ী তা পুনরায় ব্যবহারযোগ্য করে তোলে।
Hibernate-এ দুটি ক্যাশিং লেভেল রয়েছে:
Session
-এর সাথে যুক্ত।Session
-এর নিজস্ব আলাদা ক্যাশ রয়েছে।Session
এর মধ্যে পুনরায় ডেটা রিট্রিভ করার সময় ডেটাবেস কুয়েরি না করে মেমোরি থেকে ডেটা প্রদান করে।উদাহরণ:
Session session = sessionFactory.openSession();
Product product1 = session.get(Product.class, 1L); // ডাটাবেস থেকে লোড
Product product2 = session.get(Product.class, 1L); // ক্যাশ থেকে লোড
SessionFactory
-এর সাথে যুক্ত।Session
এর মধ্যে ডেটা শেয়ার করা যায়।ক্যাশিং সরঞ্জাম: Hibernate Second Level Cache বাস্তবায়নের জন্য নিচের ক্যাশিং লাইব্রেরি ব্যবহার করা যেতে পারে:
Hibernate-এ First Level Cache ডিফল্টভাবে সক্রিয় থাকে এবং এর জন্য কোনো অতিরিক্ত কনফিগারেশন প্রয়োজন হয় না।
১. Maven ডিপেনডেন্সি যোগ করা
pom.xml
ফাইলে Second Level Cache এর জন্য EhCache ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.6.5.Final</version>
</dependency>
২. Hibernate কনফিগারেশন
application.properties
বা application.yml
ফাইলে Second Level Cache সক্রিয় করতে নিম্নলিখিত সেটিংস যুক্ত করুন:
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
৩. Entity-তে ক্যাশিং সক্রিয় করা
ক্যাশিং সক্রিয় করতে Entity ক্লাসে @Cache
অ্যানোটেশন ব্যবহার করুন:
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {
@Id
private Long id;
private String name;
private Double price;
// Getters and Setters
}
READ_WRITE
, NONSTRICT_READ_WRITE
, ইত্যাদি।Hibernate-এর Caching অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করার একটি গুরুত্বপূর্ণ কৌশল। First Level Cache স্বয়ংক্রিয় হলেও Second Level Cache কনফিগার করে বড় ডেটাসেট এবং জটিল অ্যাপ্লিকেশনগুলোর জন্য আরও কার্যকর সমাধান পাওয়া যায়।
Hibernate, Spring Boot ORM এর ডিফল্ট ইমপ্লিমেন্টেশন হিসেবে, Caching সিস্টেম ব্যবহার করে ডেটাবেস অপারেশনের পারফরম্যান্স উন্নত করে। Hibernate-এ দুটি স্তরের ক্যাশিং রয়েছে: First Level Cache এবং Second Level Cache। এগুলো ডেটাবেসে বারবার রিকোয়েস্ট পাঠানো থেকে বিরত রাখে এবং অ্যাপ্লিকেশনকে দ্রুততর করে।
First Level Cache Hibernate-এর ডিফল্ট ক্যাশিং মেকানিজম এবং প্রতিটি Session-এর সাথে যুক্ত থাকে। এটি স্বয়ংক্রিয়ভাবে কাজ করে এবং ডেভেলপারের জন্য কোনো অতিরিক্ত কনফিগারেশন প্রয়োজন হয় না।
Session session = sessionFactory.openSession();
Product product1 = session.get(Product.class, 1L); // প্রথমবার ডেটাবেস থেকে ডেটা ফেচ করবে।
Product product2 = session.get(Product.class, 1L); // দ্বিতীয়বার ক্যাশ থেকে ডেটা ফেচ করবে।
session.close();
Second Level Cache সেশন-পরিসীমার বাইরে কাজ করে এবং SessionFactory-এর সাথে যুক্ত থাকে। এটি ক্যাশিংয়ের জন্য দীর্ঘমেয়াদি সমাধান এবং ডেটা বিভিন্ন সেশনের মধ্যে শেয়ার করতে পারে।
pom.xml
-এ Hibernate Ehcache এর ডিপেনডেন্সি যোগ করুন।
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.6.7.Final</version>
</dependency>
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
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {
@Id
private Long id;
private String name;
private Double price;
// Getters and Setters
}
Session session1 = sessionFactory.openSession();
Product product1 = session1.get(Product.class, 1L); // প্রথমবার ডেটাবেস থেকে ফেচ হবে।
session1.close();
Session session2 = sessionFactory.openSession();
Product product2 = session2.get(Product.class, 1L); // দ্বিতীয়বার Second Level Cache থেকে ফেচ হবে।
session2.close();
বৈশিষ্ট্য | First Level Cache | Second Level Cache |
---|---|---|
ক্যাশ স্কোপ | শুধুমাত্র একটি সেশনের মধ্যে সীমাবদ্ধ। | সমস্ত সেশন জুড়ে কার্যকর। |
ডিফল্ট সক্রিয়তা | Hibernate-এ ডিফল্টভাবে সক্রিয়। | ডেভেলপারদের সক্রিয় করতে হয়। |
অবস্থান | Session এর সাথে যুক্ত। | SessionFactory এর সাথে যুক্ত। |
ডেটা শেয়ারিং | সেশনগুলোর মধ্যে ডেটা শেয়ার হয় না। | সমস্ত সেশন ডেটা শেয়ার করতে পারে। |
কনফিগারেশন প্রয়োজন | কনফিগারেশন ছাড়াই কাজ করে। | ক্যাশিং প্রোভাইডার এবং সেটআপ প্রয়োজন। |
ব্যবহার ক্ষেত্র | ছোট ডেটা স্টোরেজ বা ট্রানজিয়েন্ট ডেটার জন্য। | বড় ডেটা বা দীর্ঘমেয়াদি ক্যাশিংয়ের জন্য। |
Hibernate-এর First Level Cache এবং Second Level Cache ডেটাবেস অপারেশনের কার্যকারিতা উন্নত করে। First Level Cache সেশনের মধ্যে ডেটা সংরক্ষণ করে দ্রুত অ্যাক্সেস নিশ্চিত করে, যেখানে Second Level Cache সেশনের বাইরের জন্য ডেটা ক্যাশ করে দীর্ঘমেয়াদি পারফরম্যান্স উন্নত করে। অ্যাপ্লিকেশনের প্রয়োজন অনুসারে এই দুই ক্যাশিং পদ্ধতির ব্যবহার নির্ধারণ করা উচিত।
Hibernate-এ ক্যাশিং একটি গুরুত্বপূর্ণ কৌশল যা ডেটাবেজ অ্যাক্সেস কমিয়ে পারফরম্যান্স বৃদ্ধি করে। Hibernate দুটি স্তরের ক্যাশিং প্রদান করে:
EhCache হলো একটি উচ্চ পারফরম্যান্স, ওপেন-সোর্স ক্যাশিং সল্যুশন যা Hibernate-এর দ্বিতীয় স্তরের ক্যাশিং পরিচালনার জন্য ব্যবহার করা হয়।
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.x.x</version>
</dependency>
application.properties
ফাইলে EhCache সক্রিয় করার জন্য নিম্নলিখিত কনফিগারেশন যোগ করুন:
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
ehcache.xml
ফাইল তৈরিEhCache এর কনফিগারেশন ফাইল তৈরি করুন:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.ehcache.org/v3"
xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd">
<cache alias="default">
<expiry>
<ttl unit="seconds">600</ttl>
</expiry>
<heap unit="entries">1000</heap>
</cache>
</config>
Entity ক্লাসে ক্যাশিং এনাবল করতে @Cache
অ্যানোটেশন ব্যবহার করুন:
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double price;
// Getters and Setters
}
Hazelcast হলো একটি ডিস্ট্রিবিউটেড ইন-মেমোরি ডেটা গ্রিড, যা ক্যাশিং এবং ক্লাস্টারিং সমর্থন করে। এটি Hibernate-এর দ্বিতীয় স্তরের ক্যাশিংয়ের জন্য ব্যবহার করা যেতে পারে।
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-hibernate5</artifactId>
<version>2.x.x</version>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
<version>5.x.x</version>
</dependency>
application.properties
ফাইলে Hazelcast সক্রিয় করার জন্য নিম্নলিখিত কনফিগারেশন যোগ করুন:
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=com.hazelcast.hibernate.HazelcastCacheRegionFactory
Hazelcast এর জন্য একটি কনফিগারেশন ফাইল তৈরি করুন:
import com.hazelcast.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HazelcastConfig {
@Bean
public Config hazelcastConfig() {
Config config = new Config();
config.setInstanceName("hazelcast-instance")
.getMapConfig("default")
.setTimeToLiveSeconds(600);
return config;
}
}
Entity ক্লাসে ক্যাশিং চালু করতে @Cache
ব্যবহার করুন:
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String productName;
private Integer quantity;
// Getters and Setters
}
বৈশিষ্ট্য | EhCache | Hazelcast |
---|---|---|
উপস্থিতি | একক নোড বা ডিস্ট্রিবিউটেড | ডিস্ট্রিবিউটেড (ক্লাস্টার সমর্থন) |
পারফরম্যান্স | ছোট এবং স্থানীয় ক্যাশের জন্য উপযুক্ত | বড় ও ডিস্ট্রিবিউটেড সিস্টেমে কার্যকর |
ক্লাস্টারিং সমর্থন | সীমিত বা অতিরিক্ত কনফিগারেশন প্রয়োজন | বিল্ট-ইন ক্লাস্টারিং সমর্থন |
সহজতা | সহজ এবং হালকা | কনফিগারেশন একটু জটিল |
ব্যবহারক্ষেত্র | ছোট অ্যাপ্লিকেশন | বড় স্কেল ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন |
Hibernate-এ EhCache এবং Hazelcast এর ইন্টিগ্রেশন ডেটাবেজ অ্যাক্সেস অপটিমাইজ করে এবং অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করে।
Hibernate Caching একটি গুরুত্বপূর্ণ ফিচার, যা ডাটাবেস অ্যাক্সেস অপ্টিমাইজ করার জন্য ব্যবহৃত হয়। এটি ডেটাবেস থেকে ডেটা পুনরায় রিট্রিভ না করে, মেমোরি থেকে দ্রুত অ্যাক্সেস নিশ্চিত করে। Hibernate Caching ব্যবহার করে অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি করা যায়।
Hibernate দুটি ধরণের ক্যাশিং সাপোর্ট করে:
Session
-এর মধ্যে ডেটা ক্যাশ করে রাখে।First-Level Cache স্বয়ংক্রিয়ভাবে Hibernate Session-এ কাজ করে। এখানে কোনো অতিরিক্ত কনফিগারেশন প্রয়োজন নেই।
Session session = sessionFactory.openSession();
// প্রথমবার ডেটা লোড করবে
User user1 = session.get(User.class, 1L);
// একই সেশনে আবার অ্যাক্সেস করলে ডেটাবেসে কোয়েরি হবে না
User user2 = session.get(User.class, 1L);
session.close();
ডিফল্ট বিহেভিয়র: user1
এবং user2
একই অবজেক্ট রেফারেন্স হবে, এবং Hibernate ডেটাবেসে দ্বিতীয়বার কোয়েরি করবে না।
Second-Level Cache সেটআপ করতে Ehcache
ব্যবহার করা যেতে পারে।
Dependency যোগ করুনpom.xml
-এ Ehcache-এর জন্য নিচের ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
</dependency>
Hibernate Configuration (application.properties)
Hibernate 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
Ehcache Configurations (ehcache.xml)
Ehcache ব্যবহারের জন্য ehcache.xml
ফাইল তৈরি করুন:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.ehcache.org/v3"
xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd">
<cache alias="userCache">
<heap unit="entries">100</heap>
<expiry>
<ttl unit="seconds">300</ttl>
</expiry>
</cache>
</config>
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
}
// প্রথমবার ডেটা লোড
User user1 = session1.get(User.class, 1L);
session1.close();
// নতুন সেশনে একই ডেটা লোড করলে ক্যাশ থেকে রিট্রিভ হবে
Session session2 = sessionFactory.openSession();
User user2 = session2.get(User.class, 1L);
session2.close();
ক্যাশ বিহেভিয়র:
Hibernate Caching, বিশেষত Second-Level Cache, ব্যবহার করে স্প্রিং বুট অ্যাপ্লিকেশনের ডেটাবেস অপারেশন দ্রুত এবং কার্যকর করা যায়। Ehcache এর মতো কনফিগারেবল ক্যাশিং সলিউশন ব্যবহার করে পারফরম্যান্স অপ্টিমাইজেশন আরও কার্যকরভাবে করা যায়।
Read more