iBATIS (MyBatis) একটি SQL Mapping Framework যা Java objects এবং SQL queries এর মধ্যে সম্পর্ক স্থাপন করতে ব্যবহৃত হয়। Database connection pooling এবং caching techniques দুটি গুরুত্বপূর্ণ ধারণা যা iBATIS/MyBatis-এ পারফরম্যান্স অপটিমাইজেশন নিশ্চিত করতে ব্যবহৃত হয়। এই দুটি কৌশল সিস্টেমের কার্যকারিতা বাড়ায় এবং ডেটাবেসের প্রতি অপ্রয়োজনীয় লোড কমায়।
এখানে আমরা database connection pooling এবং caching techniques এর ব্যবহার এবং কনফিগারেশন সম্পর্কিত কিছু গুরুত্বপূর্ণ ধারণা আলোচনা করব।
1. Database Connection Pooling
Database connection pooling একটি গুরুত্বপূর্ণ কৌশল যা database connections পুনঃব্যবহার করতে সাহায্য করে, যাতে বার বার new database connections তৈরি করার প্রয়োজন না পড়ে। এতে database connection overhead কমে যায় এবং database operations দ্রুত কার্যকরী হয়।
What is Connection Pooling?
Connection pooling হল একটি প্রযুক্তি যা অ্যাপ্লিকেশন এবং ডেটাবেসের মধ্যে connections তৈরি এবং ব্যবহারের প্রক্রিয়াকে পরিচালনা করে। যখন একটি database connection তৈরি করা হয়, এটি pool-এ রাখা হয় এবং যখন প্রয়োজন হয় তখন পুনরায় ব্যবহৃত হয়। এতে database connection creation overhead হ্রাস পায় এবং অ্যাপ্লিকেশন আরও দ্রুত কার্যকরী হয়।
Best Practice:
- MyBatis-এ connection pooling চালু করতে, সাধারণত একটি external library যেমন C3P0, HikariCP, বা DBCP ব্যবহার করা হয়।
Using HikariCP with MyBatis:
HikariCP হল একটি হালকা, দ্রুত এবং জনপ্রিয় connection pooling লাইব্রেরি। এটি সাধারণত MyBatis-এ ব্যবহৃত হয়।
Step 1: Add HikariCP Dependency
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.0</version>
</dependency>
Step 2: Configure MyBatis with HikariCP
MyBatis কনফিগারেশন ফাইলে HikariCP ব্যবহার করতে নিম্নলিখিত কনফিগারেশন যোগ করুন:
<configuration>
<environments>
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
<property name="poolMaximumActiveConnections" value="10"/>
<property name="poolMaximumIdleConnections" value="5"/>
<property name="poolMaximumCheckoutTime" value="20000"/>
</dataSource>
</environment>
</environments>
</configuration>
Step 3: HikariCP Configuration
আপনি HikariCP কনফিগারেশনের জন্য DataSource এবং connection pooling কাস্টমাইজ করতে পারেন:
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("root");
dataSource.setPassword("password");
dataSource.setMaximumPoolSize(10); // Max connections in pool
dataSource.setIdleTimeout(300000); // Max idle time for a connection
dataSource.setMaxLifetime(600000); // Max lifetime for a connection
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(configuration);
Explanation:
- HikariCP ব্যবহার করলে database connection দ্রুত এবং কার্যকরীভাবে ম্যানেজ করা যায়।
- আপনি maximum pool size, idle timeout, এবং max lifetime কনফিগার করে connections-এর পরিচালনা কাস্টমাইজ করতে পারেন।
2. Caching Techniques
Caching হল ডেটার temporary storage যেখানে ডেটাবেস থেকে পুনরায় একাধিক বার একই ডেটা আনতে না হয়। Caching techniques ব্যবহারের মাধ্যমে অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করা যায়।
MyBatis-এ দুটি ধরনের ক্যাশিং সিস্টেম রয়েছে:
- First-level Cache (Session-Level Cache):
- এটি SqlSession এর মধ্যে ডেটা ক্যাশ করে। এটি MyBatis-এর ডিফল্ট ক্যাশিং মেকানিজম এবং automatic ভাবে কাজ করে।
- First-level cache শুধুমাত্র current session এর মধ্যে কাজ করে এবং session close হলে এটি পরিষ্কার হয়ে যায়।
- Second-level Cache (Global Cache):
- এটি SqlSessionFactory এর মধ্যে কাজ করে এবং multiple sessions এর মধ্যে শেয়ার করা যেতে পারে।
- এটি external cache providers (যেমন EHCache, Redis) এর সাথে ইন্টিগ্রেট করা যায়।
Best Practices for Caching:
- First-level cache স্বয়ংক্রিয়ভাবে সক্রিয় থাকে এবং সাধারণত SqlSession এর মধ্যে ব্যবহৃত হয়। আপনাকে এটি সক্রিয় করতে কিছুই করতে হয় না।
- Second-level cache সক্রিয় করার জন্য আপনাকে mapper বা SQL queries এর জন্য ক্যাশ কনফিগারেশন করতে হয়।
3. Second-level Cache Configuration in MyBatis
Step 1: Enable Second-level Cache
MyBatis-এ second-level cache চালু করতে, আপনি cacheEnabled এবং cache এলিমেন্ট ব্যবহার করেন।
MyBatis Configuration with Second-level Cache:
<configuration>
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<mappers>
<mapper resource="com/example/EmployeeMapper.xml"/>
</mappers>
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
</configuration>
Step 2: Mapper XML with Cache
<mapper namespace="com.example.EmployeeMapper">
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="false"/>
<select id="getEmployeeById" resultType="Employee">
SELECT * FROM employee WHERE id = #{id}
</select>
</mapper>
Explanation:
<cache>: এটি second-level cache কনফিগারেশনের জন্য ব্যবহৃত হয়।eviction="LRU": Least Recently Used eviction policy, যা ক্যাশে সবচেয়ে কম ব্যবহৃত আইটেমগুলিকে সাফ করে।flushInterval="60000": ক্যাশের মধ্যে থাকা তথ্য প্রতিটি 60 সেকেন্ড পর সাফ হবে।size="512": ক্যাশের মধ্যে সর্বাধিক 512টি আইটেম রাখা হবে।readOnly="false": ক্যাশে থাকা ডেটা পরিবর্তন করা যাবে।
Step 3: Using Cache in Java
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// Fetch employee, which will be cached
Employee employee1 = sqlSession.selectOne("getEmployeeById", 1);
// Fetch employee again, it will come from second-level cache
Employee employee2 = sqlSession.selectOne("getEmployeeById", 1);
System.out.println(employee1 == employee2); // Output will be true (both come from cache)
} finally {
sqlSession.close();
}
Explanation:
- প্রথমবার employee1 fetch করার পর, এটি second-level cache এ সেভ হবে।
- পরবর্তী employee2 fetch করার পর, second-level cache থেকে ডেটা আসবে এবং ডেটাবেসের প্রতি কোনো query আর পাঠানো হবে না।
4. Cache Providers in MyBatis
MyBatis-এ আপনি EHCache, Redis, Infinispan এবং অন্যান্য external cache providers ব্যবহার করতে পারেন।
Using EHCache with MyBatis:
EHCache Configuration (ehcache.xml):
<ehcache>
<cache name="employeeCache"
maxEntriesLocalHeap="1000"
eternal="false"
timeToLiveSeconds="3600"
timeToIdleSeconds="600"
overflowToDisk="false"/>
</ehcache>
MyBatis Configuration with EHCache:
<configuration>
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<mappers>
<mapper resource="com/example/EmployeeMapper.xml"/>
</mappers>
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
</configuration>
Explanation:
- EHCache ব্যবহারের মাধ্যমে, আপনি MyBatis-এ second-level cache এর কার্যকারিতা বৃদ্ধি করতে পারেন।
- EHCache কনফিগারেশন ফাইলে ক্যাশের প্রপার্টি কাস্টমাইজ করে maximum cache size, time-to-live এবং time-to-idle কনফিগার করা হয়।
- Database Connection Pooling: HikariCP, C3P0 এবং DBCP ব্যবহার করে connection pooling সক্ষম করা MyBatis-এ performance optimization এর জন্য গুরুত্বপূর্ণ। এটি ডেটাবেসের প্রতি অপ্রয়োজনীয় connection creation কমায় এবং সিস্টেমের প্রতিক্রিয়া দ্রুত করে।
- Caching Techniques: MyBatis-এ first-level cache (automatic) এবং second-level cache (global cache) ব্যবহারের মাধ্যমে ডেটার পুনঃপ্রাপ্তি গতি বৃদ্ধি করা যায়। EHCache, Redis বা অন্যান্য external cache providers ব্যবহার করে second-level cache এর কার্যকারিতা বাড়ানো সম্ভব। Cache eviction strategies (যেমন LRU, FIFO) ক্যাশের কার্যকারিতা এবং সিস্টেমের পারফরম্যান্স উন্নত করতে সাহায্য করে।
- Performance Monitoring: SQL query logging এবং cache hits/misses ট্র্যাক করে পারফরম্যান্স উন্নত করা যায়।
এই কৌশলগুলির মাধ্যমে আপনি MyBatis-এ data access layer এর কার্যকারিতা, scalability, এবং maintainability উন্নত করতে পারবেন।
Read more