Query Caching হল একটি প্রক্রিয়া যেখানে একটি SQL কুয়েরির ফলাফল ক্যাশে সংরক্ষিত থাকে, যাতে পরবর্তী কুয়েরি এক্সিকিউট করার সময় তা পুনরায় ডেটাবেস থেকে না নিয়ে ক্যাশ থেকে সরাসরি ফলাফল নেয়া যায়। Spring JDBC-এ JdbcTemplate ব্যবহার করে Query Caching বাস্তবায়ন করা যায়, তবে এটি সাধারণত Spring-এর অন্যান্য কaching প্রযুক্তি বা ক্যাশ ম্যানেজমেন্ট সিস্টেমের সাথে সমন্বয়ে করা হয়, যেমন Spring Cache, Ehcache, বা Redis।
Spring JDBC JdbcTemplate সরাসরি কুয়েরি ক্যাশিং সাপোর্ট করে না, তবে আপনি JdbcTemplate এর সঙ্গে ক্যাশিং ফ্রেমওয়ার্ক সংযুক্ত করে ক্যাশিং বাস্তবায়ন করতে পারেন।
Query Caching বাস্তবায়ন করার উপায়:
- Spring Cache ব্যবহারের মাধ্যমে
- Ehcache বা Redis ব্যবহারের মাধ্যমে
এখানে দুটি পদ্ধতির বিস্তারিত আলোচনা করা হলো।
1. Spring Cache ব্যবহার করে Query Caching
Spring Frameworkে ক্যাশিং বাস্তবায়নের জন্য @Cacheable অ্যানোটেশন ব্যবহার করা যেতে পারে। এটি Spring Cache abstraction API এর মাধ্যমে ক্যাশিং পরিচালনা করে। Spring Cache ব্যবহার করতে হলে, আপনাকে একটি ক্যাশ ম্যানেজার কনফিগার করতে হবে, যেমন Ehcache বা Redis।
Spring Cache এর মাধ্যমে JdbcTemplate কুয়েরি ক্যাশিং:
প্রথমে Spring Cache কনফিগারেশন সেটআপ করতে হবে এবং তারপরে JdbcTemplate এর মাধ্যমে SQL কুয়েরি ক্যাশ করা যাবে।
Pom.xml এ Spring Cache এবং Ehcache ডিপেনডেন্সি যোগ করা:
<dependencies>
<!-- Spring Cache Dependency -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.3.23</version>
</dependency>
<!-- Ehcache Dependency -->
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.9.7</version>
</dependency>
</dependencies>
Spring Cache Configuration:
Spring Cache কনফিগারেশন করতে @EnableCaching অ্যানোটেশন ব্যবহার করা হয়।
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.CacheManager;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public EhCacheManagerFactoryBean ehCacheManager() {
EhCacheManagerFactoryBean cacheManager = new EhCacheManagerFactoryBean();
cacheManager.setConfigLocation("classpath:ehcache.xml"); // ehcache.xml ফাইলটি কনফিগার করতে হবে
return cacheManager;
}
@Bean
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheManager().getObject());
}
}
@Cacheable ব্যবহার করে JdbcTemplate Query Caching:
import org.springframework.cache.annotation.Cacheable;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final JdbcTemplate jdbcTemplate;
public UserService(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Cacheable(value = "usersCache", key = "#userId")
public String getUserNameById(int userId) {
String sql = "SELECT name FROM users WHERE id = ?";
return jdbcTemplate.queryForObject(sql, String.class, userId);
}
}
এখানে:
- @Cacheable অ্যানোটেশন ব্যবহার করে
getUserNameByIdমেথডের জন্য ক্যাশিং নির্ধারণ করা হয়েছে। value-এ ক্যাশের নাম (যেমনusersCache) এবংkey-এ ক্যাশের কী হিসাবেuserIdব্যবহার করা হয়েছে।- প্রথমবার কুয়েরি এক্সিকিউট হওয়ার পর, ফলাফল ক্যাশে সংরক্ষিত হবে এবং পরবর্তীতে একই
userIdএর জন্য কুয়েরি আবার ডেটাবেস থেকে না গিয়ে ক্যাশ থেকে পাওয়া যাবে।
Ehcache কনফিগারেশন (ehcache.xml):
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ehcache.org/ehcache/3.0 http://www.ehcache.org/ehcache/3.0/ehcache.xsd">
<cache alias="usersCache">
<heap>1000</heap> <!-- ক্যাশে সর্বোচ্চ 1000 আইটেম সংরক্ষণ করবে -->
<expiry>
<ttl>10m</ttl> <!-- ক্যাশে সংরক্ষিত ডেটা 10 মিনিট পর এক্সপায়ার হবে -->
</expiry>
</cache>
</ehcache>
2. Ehcache বা Redis ব্যবহার করে Query Caching
Ehcache এবং Redis ক্যাশিং প্রযুক্তির মাধ্যমে আরও উন্নত ক্যাশিং বাস্তবায়ন করা যায়। এগুলো বড় পরিমাণ ডেটা বা ডিস্ট্রিবিউটেড ক্যাশ সিস্টেমের জন্য উপযুক্ত।
Redis ব্যবহার:
Redis ব্যবহার করতে হলে, আপনাকে Spring Data Redis কনফিগারেশন করতে হবে এবং Redis ক্যাশ ম্যানেজার ব্যবহার করতে হবে।
Pom.xml এ Redis ডিপেনডেন্সি যোগ করা:
<dependencies>
<!-- Spring Data Redis Dependency -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>3.0.0</version>
</dependency>
<!-- Lettuce Redis Client Dependency -->
<dependency>
<groupId>io.lettuce.core</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.1.5</version>
</dependency>
</dependencies>
Redis Cache Configuration:
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.redis.RedisCacheManager;
import org.springframework.cache.redis.RedisCacheConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCaching
public class RedisCacheConfig {
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration cacheConfig = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
return RedisCacheManager.builder(redisConnectionFactory)
.cacheDefaults(cacheConfig)
.build();
}
}
সংক্ষেপে:
Spring JDBC এর JdbcTemplate-এর মাধ্যমে Query Caching বাস্তবায়ন করতে, Spring Cache ব্যবহার করা যায়, যা বিভিন্ন ক্যাশ ম্যানেজার (যেমন Ehcache বা Redis) এর সাথে সমন্বয়ে কাজ করে। @Cacheable অ্যানোটেশন ব্যবহার করে ক্যাশিং সিস্টেমটি খুব সহজে কার্যকর করা যায়। Query Caching ব্যবহারের মাধ্যমে ডেটাবেসে অতিরিক্ত লোড কমানো যায় এবং অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি পায়।
Read more