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

Spring Data JPA ৩-এর মাধ্যমে পারফরম্যান্স সমস্যার সমাধান ও টিপস

Introduction

আজকের এই আলোচনায় আমরা শিখব কীভাবে Spring Data JPA ব্যবহার করে একটি দ্রুত এবং শক্তিশালী ডাটাবেস লেয়ার (Persistence Layer) তৈরি করা যায়। অনেকে মনে করেন Spring Data JPA ব্যবহার করলে সবকিছু অটোমেটিক হয়ে যাবে, কিন্তু বড় প্রোজেক্টে বা অনেক ডাটার ক্ষেত্রে এটি বেশ ধীরগতি সম্পন্ন হতে পারে। এই ভিডিওতে থরবেন জ্যানসেন (Thorben Janssen) দেখিয়েছেন কীভাবে পারফরম্যান্সের সমস্যাগুলো আগেভাগেই খুঁজে বের করে সমাধান করা যায়।


পারফরম্যান্স সমস্যা শনাক্ত করা (Identifying Performance Issues)

ভিডিও রেফারেন্স: [02:43]

যেকোনো সমস্যার সমাধান করার আগে সেটি খুঁজে বের করা জরুরি। আমরা সাধারণত আমাদের লোকাল কম্পিউটারে অল্প ডাটা নিয়ে কাজ করি, তাই সব ঠিক মনে হয়। কিন্তু প্রোডাকশনে যখন লাখ লাখ ডাটা থাকে, তখন আসল সমস্যা ধরা পড়ে।

কিভাবে চেক করবেন? Hibernate-এর একটি চমৎকার ফিচার আছে যা দিয়ে আপনি প্রতিটি কুয়েরি কত সময় নিচ্ছে তা দেখতে পারেন। এর জন্য আপনার application.properties ফাইলে নিচের লাইনটি যুক্ত করতে হবে: hibernate.generate_statistics=true

এবং লগিং লেভেল DEBUG সেট করতে হবে। এতে করে আপনি কনসোলে দেখতে পাবেন কতগুলো কুয়েরি চলল এবং কত সময় লাগল [04:13]।

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

Fetch Types: Lazy বনাম Eager (Lazy vs Eager Fetching)

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

ডাটাবেস থেকে যখন একটি টেবিলের ডাটা আনা হয়, তখন তার সাথে যুক্ত অন্য টেবিলের ডাটা কখন আসবে তা নির্ধারণ করে Fetch Type।

  1. Lazy Fetching: এটি ডিফল্ট এবং ভালো। যখন আপনি কোনো ডাটা চাইবেন, তখনই সেটি ডাটাবেস থেকে আনবে। এতে মেমরি কম খরচ হয়।

  2. Eager Fetching: এটি সত্তা (Entity) তৈরির সাথে সাথেই সব ডাটা নিয়ে আসে। এটি অনেক সময় অপ্রয়োজনীয় কুয়েরি তৈরি করে পারফরম্যান্স কমিয়ে দেয়।

পরামর্শ: সবসময় @OneToMany বা @ManyToMany রিলেশনে Lazy Fetching ব্যবহার করা উচিত [10:43]।

  • সহজ ব্যাখ্যা (Lazy Fetching): মনে করুন আপনি দোকানে গেছেন চাল কিনতে। অলস বা Lazy ক্রেতা শুধু চালই আনবে। আর উৎসাহী বা Eager ক্রেতা চালের সাথে সাথে ডাল, তেল, লবণ সব নিয়ে আসবে—যদিও তার এখন ওগুলোর দরকার নেই। এতে ব্যাগ ভারী হবে (পারফরম্যান্স কমবে)।

N+1 Select সমস্যা ও সমাধান (The N+1 Select Issue)

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

এটি Spring Data JPA-এর সবচেয়ে পরিচিত সমস্যা। মনে করুন আপনার কাছে ২০ জন প্লেয়ারের লিস্ট আছে। আপনি চাচ্ছেন তাদের সবার টুর্নামেন্টের নাম জানতে। N+1 সমস্যায় প্রথমে ১টি কুয়েরি দিয়ে ২০ জন প্লেয়ারকে আনা হয়, তারপর ঐ ২০ জনের জন্য আলাদা আলাদা ২০টি কুয়েরি চালানো হয়। মোট ১+২০=২১টি কুয়েরি! এটি ডাটাবেসের ওপর অনেক চাপ ফেলে।

সমাধান: ১. Join Fetch: কুয়েরি লেখার সময় JOIN FETCH ব্যবহার করলে এক কুয়েরিতেই সব ডাটা চলে আসে। ২. Entity Graph: এটি ব্যবহার করেও আপনি কোন কোন ডাটা একসাথে আনতে চান তা বলে দিতে পারেন [15:07]।


কোডিং উদাহরণ (Coding Snippet)

এখানে দেখানো হয়েছে কীভাবে JOIN FETCH ব্যবহার করে N+1 সমস্যা দূর করা যায়:

Java

// Spring Data Repository-তে এভাবে কুয়েরি লিখতে পারেন
@Query("SELECT p FROM Player p LEFT JOIN FETCH p.tournaments")
List<Player> findAllWithTournaments(); 

ব্যাখ্যা: এই কোডটি ডাটাবেসকে বলছে, "প্লেয়ারদের ডাটা আনো এবং একই সাথে তাদের টুর্নামেন্টের তথ্যগুলোও একটি মাত্র কুয়েরিতে নিয়ে এসো।" এতে আলাদা করে আর ২০-৩০টি কুয়েরি চালানোর প্রয়োজন পড়ে না।


List-এর পরিবর্তে Set ব্যবহার করা (Using Set over List)

ভিডিও রেফারেন্স: [19:46]

Hibernate-এ @ManyToMany রিলেশনে List ব্যবহার করলে পারফরম্যান্স খারাপ হতে পারে। আপনি যদি একটি এলিমেন্ট লিস্ট থেকে ডিলিট করতে চান, তবে Hibernate পুরো টেবিলের ঐ ডাটাগুলো ডিলিট করে আবার নতুন করে ইনসার্ট করে। কিন্তু Set ব্যবহার করলে এটি সরাসরি নির্দিষ্ট রো-টি ডিলিট করে [25:21]।

  • সহজ ব্যাখ্যা (Set): Set মানে হলো এমন এক সেট ডাটা যেখানে কোনো ডুপ্লিকেট থাকবে না। এটি জাভার একটি নিয়ম যা Hibernate-কে দ্রুত কাজ করতে সাহায্য করে।

এনালাইসিস এবং আমাদের মতামত

কন্টেন্ট ক্রিয়েটর থরবেন জ্যানসেন আমাদের এটি বোঝাতে চেয়েছেন যে, শুধু ফ্রেমওয়ার্ক ব্যবহার করলেই হয় না, এর তলার কাজগুলোও (Underlying mechanism) বুঝতে হয়।

আমার চিন্তা ও পরামর্শ:

  • বাস্তবসম্মত ধারণা: প্রোডাকশনে পাঠানোর আগে সবসময় hibernate.generate_statistics অন করে চেক করুন। এটি আপনাকে অনেক বড় বিপদ থেকে বাঁচাবে।

  • বিকল্প উপায়: যদি JPA দিয়ে পারফরম্যান্স ঠিক না হয়, তবে খুব জটিল কুয়েরির জন্য 'Native SQL' বা 'JOOQ' ব্যবহার করা একটি ভালো বিকল্প হতে পারে।

  • পরামর্শ: সবসময় DTO (Data Transfer Object) বা Projection ব্যবহার করুন। পুরো Entity ডাটাবেস থেকে টেনে আনার দরকার নেই যদি আপনার শুধু নাম আর ইমেইল প্রয়োজন হয় [30:12]।

সহজ কথায়, ডাটাবেস থেকে ঠিক যতটুকু প্রয়োজন, ঠিক ততটুকুই আনুন—বেশিও না, কমও না!

[

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

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