সরাসরি প্রধান সামগ্রীতে চলে যান

Spring Data JPA এবং সেকেন্ড-লেভেল ক্যাশ ব্যবহার করে ডাটাবেস পারফরম্যান্স বাড়ানো

Introduction

আজকালকার অ্যাপ্লিকেশনগুলোতে ডাটাবেস থেকে তথ্য আনা এবং জমা করার কাজটা খুব দ্রুত হওয়া জরুরি। Spring Data JPA আমাদের কাজ অনেক সহজ করে দিলেও, কিছু ছোট ভুলের কারণে অ্যাপ্লিকেশন স্লো হয়ে যেতে পারে। এই আলোচনায় Thorben Janssen দেখিয়েছেন কীভাবে আমরা ডাটাবেস কুয়েরি অপ্টিমাইজ করতে পারি এবং বিশেষ করে 'ক্যাশিং' (Caching) ব্যবহার করে অ্যাপ্লিকেশনের গতি বাড়াতে পারি। আমরা মূলত শিখব কুয়েরি কীভাবে কম করা যায় এবং সেকেন্ড-লেভেল ক্যাশ (Second-Level Cache) কীভাবে কাজ করে।


১. পারফরম্যান্স সমস্যা খুঁজে বের করা (Hibernate Statistics)

ভিডিওর শুরুতে দেখানো হয়েছে যে, আমাদের কোড কেন স্লো হচ্ছে তা আগে বুঝতে হবে। এর জন্য Hibernate-এর কিছু বিশেষ সেটিংস অন করা যায়।

ভিডিও রেফারেন্স: [03:58]

বিস্তারিত: আপনার অ্যাপ্লিকেশনের application.properties ফাইলে hibernate.generate_statistics প্রপার্টিটি true করে দিলে আপনি লগ (Log) এ দেখতে পাবেন কতগুলো কুয়েরি চলছে, কত সময় লাগছে এবং ক্যাশ থেকে কয়টা ডেটা আসছে। এটি ডেভেলপমেন্টের সময় চালু রাখা খুব জরুরি।

  • সহজ ব্যাখ্যা: এটি অনেকটা আপনার গাড়ির ড্যাশবোর্ডের মতো, যা আপনাকে দেখাবে আপনার কোড কতবার ডাটাবেসে নক করছে।

  • কঠিন শব্দ: * Statistics: এর অর্থ হলো তথ্য বা পরিসংখ্যান। এখানে এটি কুয়েরির হিসাব বোঝায়।

    • Log: অ্যাপ্লিকেশনের ভেতরে কী কী ঘটছে তার একটি ডায়েরি বা রেকর্ড।

২. N+1 Select সমস্যা এবং সমাধান

এটি JPA-তে পারফরম্যান্সের সবচেয়ে বড় শত্রু। যখন আপনি একটি লিস্ট আনতে গিয়ে তার প্রতিটির জন্য আলাদা আলাদা কুয়েরি করেন, তখন তাকে N+1 সমস্যা বলে।

ভিডিও রেফারেন্স: [12:51]

কোডিং উদাহরণ:

Java

// Query-specific fetching using @Query
@Query("SELECT p FROM Player p LEFT JOIN FETCH p.tournaments")
List<Player> findAllWithTournaments(); 

ব্যাখ্যা: এখানে JOIN FETCH ব্যবহার করা হয়েছে। সাধারণ JOIN করলে ডাটাবেস শুধু মিলিয়ে দেখে, কিন্তু JOIN FETCH করলে খেলোয়াড়ের তথ্যের সাথে সাথে তার সব টুর্নামেন্টের তথ্য এক কুয়েরিতেই নিয়ে আসে। এতে ডাটাবেসে বারবার যাওয়ার প্রয়োজন হয় না।


৩. ক্যাশিং স্ট্র্যাটেজি (Caching Strategies)

ক্যাশিং মানে হলো বারবার একই তথ্য ডাটাবেস থেকে না এনে মেমরিতে (RAM) জমা রাখা।

ভিডিও রেফারেন্স: [41:00]

টপিক ডিটেইলস: ভিডিওতে দুই ধরনের ক্যাশ নিয়ে কথা বলা হয়েছে:

  • First-Level Cache: এটি অটোমেটিক থাকে এবং শুধুমাত্র একটি ট্রানজ্যাকশন বা সেশনের জন্য কাজ করে।

  • Second-Level Cache: এটি পুরো অ্যাপ্লিকেশন জুড়ে থাকে। যদি একজন ইউজার একবার ডেটা দেখে, তবে অন্য ইউজার সেই ডেটা ক্যাশ থেকেই পেতে পারে।

আমার চিন্তা: ক্যাশ ব্যবহার করা ভালো, কিন্তু যেখানে ডেটা খুব ঘন ঘন আপডেট হয় সেখানে ক্যাশ ব্যবহার করলে ভুল তথ্য দেখানোর ভয় থাকে। তাই যেখানে ডেটা শুধু পড়া হয় (Read-heavy), সেখানে এটি সবচেয়ে কার্যকর।


৪. সেকেন্ড-লেভেল ক্যাশ (Second-Level Cache)

ভিডিওর শেষের দিকে বিস্তারিত বলা হয়েছে যে কীভাবে এই ক্যাশ সেটআপ করতে হয়।

ভিডিও রেফারেন্স: [42:21]

বিস্তারিত: সেকেন্ড-লেভেল ক্যাশ সরাসরি চালু থাকে না। এর জন্য এনটিটি (Entity) ক্লাসের উপরে @Cacheable অ্যানোটেশন দিতে হয়।

কোডিং উদাহরণ:

Java

@Entity
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Player {
    @Id
    private Long id;
    private String name;
    // getters and setters
} 

ব্যাখ্যা: এই কোডটি হাইবারনেটকে বলছে যে Player ডেটাগুলো যেন সেকেন্ড-লেভেল ক্যাশে রাখা হয়। READ_WRITE ব্যবহারের মানে হলো আমরা ডেটা পড়তেও পারব আবার আপডেটও করতে পারব নিরাপদে।

  • সহজ ব্যাখ্যা: এটি অনেকটা আপনার বাসার ফ্রিজের মতো। বাজার (ডাটাবেস) থেকে সবজি এনে ফ্রিজে (ক্যাশ) রাখলে বারবার বাজারে যেতে হয় না।

  • কঠিন শব্দ: * Entity: ডাটাবেসের একটি টেবিলকে জাভা কোডে রিপ্রেজেন্ট করার ক্লাস।

    • Persistence Context: একটি মেমরি এরিয়া যেখানে JPA অবজেক্টগুলোকে ম্যানেজ করে।

৫. অ্যানালাইসিস ও বাস্তবতা (Analysis & Thinking)

মূল বক্তব্য: কন্টেন্ট ক্রিয়েটর Thorben Janssen বোঝাতে চেয়েছেন যে, অন্ধভাবে ক্যাশ ব্যবহার করলেই হবে না। আপনাকে জানতে হবে আপনার কুয়েরি ক্যাশ হিট করছে কি না। অনেক সময় আমরা কুয়েরি চালাই কিন্তু সেটি ক্যাশ থেকে আসে না কারণ আমরা সরাসরি ID দিয়ে ডেটা খুঁজছি না।

বাস্তবসম্মত ধারণা ও পরামর্শ: ১. বিকল্প চিন্তা: অনেক সময় সেকেন্ড-লেভেল ক্যাশ কনফিগার করা ঝামেলার হতে পারে। সেক্ষেত্রে Redis বা Memcached এর মতো আলাদা ডিস্ট্রিবিউটেড ক্যাশ ব্যবহার করা বড় প্রজেক্টের জন্য বেশি ভালো। ২. পরামর্শ: সবসময় আগে কুয়েরি অপ্টিমাইজ করুন (যেমন: Projection বা Join Fetch)। এরপরও যদি স্লো থাকে, কেবল তখনই ক্যাশিংয়ের চিন্তা করুন। ৩. সতর্কতা: অনেক বেশি ডেটা ক্যাশে রাখলে আপনার অ্যাপ্লিকেশনের RAM শেষ হয়ে যেতে পারে (Memory Leak), তাই ক্যাশ কত সময় থাকবে (TTL) তা ঠিকঠাক সেট করা উচিত।

এই ভিডিওটি একজন বিগিনারের জন্য পারফরম্যান্স অপ্টিমাইজেশনের একটি চমৎকার গাইডলাইন হিসেবে কাজ করবে।

[

Build faster persistence layers with Spring Data JPA 3 by Thorben Janssen @ Spring I/O 2024

Spring I/O · 30K views

](http://www.youtube.com/watch?v=t27Uozc2Z58)

মন্তব্যসমূহ

এই ব্লগটি থেকে জনপ্রিয় পোস্টগুলি

সিজ্জিন (Sijjin) vs ইল্লিয়িন (Illiyin) পার্থক্য Difference

Sijjin (سِجِّين) এবং Illiyin (عِلِّيِّين) —এ দুটি শব্দ কুরআনে এসেছে এবং দুটোই মানুষের আমলনামা সংরক্ষণ সম্পর্কিত স্থানকে নির্দেশ করে। ১. সিজ্জিন (Sijjin) সিজ্জিন হলো পাপীদের (কাফের, মুনাফিক ও দুরাচারীদের) আমলনামা সংরক্ষণের স্থান। এটি সাত তলদেশের নীচে এক কারাগার বা অন্ধকার জগতে অবস্থিত বলে উল্লেখ রয়েছে। সূরা আল-মুতাফফিফীন (৮৩:৭-৯) তে বলা হয়েছে: "كَلَّا إِنَّ كِتَابَ الْفُجَّارِ لَفِي سِجِّينٍ ۝ وَمَا أَدْرَاكَ مَا سِجِّينٌ ۝ كِتَابٌ مَرْقُومٌ" অর্থ: "না, পাপীদের আমলনামা সিজ্জিনে সংরক্ষিত। তুমি কি জানো, সিজ্জিন কী? এটি এক লিখিত দলিল।" সিজ্জিনকে একটি কারাগার, সংকীর্ণ স্থান, বা নিচের স্তরে অবস্থিত এক অন্ধকার দুনিয়া হিসেবে ব্যাখ্যা করা হয়। ২. ইল্লিয়িন (Illiyin) ইল্লিয়িন হলো সৎকর্মশীলদের (মুমিন ও নেককারদের) আমলনামা সংরক্ষণের স্থান । এটি সপ্তম আসমানের ওপরে সংরক্ষিত এক সম্মানিত স্থান। সূরা আল-মুতাফফিফীন (৮৩:১৮-২১) তে বলা হয়েছে: "كَلَّا إِنَّ كِتَابَ الْأَبْرَارِ لَفِي عِلِّيِّينَ ۝ وَمَا أَدْرَاكَ مَا عِلِّيُّونَ ۝ كِتَابٌ مَرْقُومٌ ۝ يَش...

তারাবিহ সমগ্র - প্রথম আলো

রামাদান ২০২৪ উপলক্ষে প্রথম আলোর নিয়মিত আয়োজন - খতমে তারাবিহ'র সূরা গুলো নিয়ে সংক্ষিপ্ত আলোচনা'র লিংক  নিচে দেওয়া হলো।  লিংকে ক্লিক করলেই আপনাকে আলোচনা তে নিয়ে যাবে। তারাবিহ: ১ | একটি খুন ও গাভি নিয়ে বনি ইসরাইলের বাড়াবাড়ি তারাবিহ: ২ | নারীর মর্যাদা ও অধিকার এবং অলৌকিক তিন ঘটনা তারাবিহ: ৩ | যে ১৪ নারীকে বিয়ে করা হারাম তারাবিতে: ১২ | মহানবী (সা.)–এর আকাশভ্রমণ এবং আসহাবে কাহাফের কাহিনি

রেডমি নোট ৯ এর বিস্তারিত | Redmi Note 9 in Bangla

৩০ এপ্রিল, ২০২০ এ শাওমির ঘোষনা আসে এই ফোনটি নিয়ে। কিন্তু ফোনটি মার্কেটে আসে মে মাসের শেষের দিকে৷ করোনার কারনে ফোনটি বাংলাদেশে আসতে আরো সময় নেয়। বর্তমানে বাংলাদেশে আন অফিশিয়াল ভাবে ফোনটি পাওয়া যাচ্ছে৷ বাংলাদেশে অফিশিয়াল ভাবে এখনো ফোনটি আসার তথ্য নেয়৷ চলুন ফোনটি নিয়ে বিস্তারিত আলোচনা করা যাক। শাওমি নোট সিরিজের ফোন বের করে এদের রেডমি নামে সাব ব্যান্ড৷ এদের কাজ হল এই নোট সিরিজ নিয়ে কাজ করা৷ প্রতিবছর নোট সিরিজের ১/২ টা ফোন বাজারে আসে। সাথে সেই ফোন গুলার বিভিন্ন ভার্সন (যেমন - র‍্যাম ও রমের ভিত্তিতে) বাজারে আসে। এই বছরও তারা রেডমি সিরিজের নোট ৯ বাজারে আনে। এই বছর হয়তো এই সিরিজের আরো ফোন বাজারে আসবে। ডিস্পলেঃ ফোনটির ডিসপ্লে সাইজ ৬.৫৩ ইঞ্চি। এতে আইপিএস এলসিডি ডিসপ্লে ব্যবহার করা হয়েছে। এই ফোনের ডিসপ্লে প্রটেকশন হিসেবে আছে গরিলা গ্লাস ফাইভ। স্ক্রিন আর ফোনের বডির অনুপাত প্রায় ৮৩.৫%। এই ফোনের ডিসপ্লে ফুলএইচডি মানে ১০৮০পি। এই ডিস্পলের দৈর্ঘ্য ১৯.৫ একক এবং প্রস্থ হল ৯ একক। এত বড় ফোনের কারনে এই ফোনের পিপি আই ডেনসিটি ৩৯৫। যা একটু কম। প্লাটফর্মঃ এই ফোনের অপারেটিং সিস্টেম এন্ড্রয়েড ১০ এবং এর...