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

Spring Data JPA ৩ দিয়ে ডাটাবেস পারফরম্যান্স অপ্টিমাইজেশন

এই ভিডিওতে Thorben Janssen দেখিয়েছেন কীভাবে Spring Data JPA এবং Hibernate ব্যবহার করে একটি অ্যাপ্লিকেশনের ডাটাবেস লেয়ারকে আরও দ্রুত এবং স্কেলেবল (Scalable) করা যায়। আমরা অনেক সময় দেখি যে ছোট ডেটা নিয়ে কাজ করার সময় কোড ভালো চললেও প্রোডাকশনে বেশি ডেটা আসার পর তা স্লো হয়ে যায়। এই আলোচনায় সেই সমস্যাগুলো ধরার উপায় এবং সমাধানের কৌশলগুলো খুব সহজভাবে তুলে ধরা হয়েছে।


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

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

যেকোনো সমস্যার সমাধান করার আগে সেটি খুঁজে বের করা জরুরি। ভিডিওর শুরুতে Thorben দেখিয়েছেন কীভাবে হিবারনেট (Hibernate) এর স্ট্যাটিস্টিকস ব্যবহার করে ডাটাবেস কোয়েরির সংখ্যা এবং সময় ট্র্যাক করা যায়।

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

  • কঠিন শব্দের সহজ অর্থ: * Statistics (পরিসংখ্যান): এখানে কুয়েরি কতবার চলল বা কত সময় নিল তার হিসাব।

    • Logging (লগিং): অ্যাপ্লিকেশনের ভেতরে কী ঘটছে তা লিখে রাখা।
  • আমার চিন্তাভাবনা: আপনি যদি না জানেন আপনার কোড ডাটাবেসে কয়বার নক করছে, তবে আপনি কখনোই সিস্টেম ফাস্ট করতে পারবেন না। তাই ডেভেলপমেন্টের শুরুতেই এটি চালু করা উচিত।

কোড উদাহরণ: আপনার application.properties ফাইলে নিচের লাইনগুলো যোগ করতে হবে:

Properties

# হিবারনেট স্ট্যাটিস্টিকস জেনারেট করবে
spring.jpa.properties.hibernate.generate_statistics=true
# লগ লেভেল ডিবাগ মুডে সেট করা যাতে বিস্তারিত দেখা যায়
logging.level.org.hibernate.stat=debug 

এই কোড দিয়ে কী হবে? এটি আপনার কনসোলে দেখাবে যে একটি ট্রানজ্যাকশনে মোট কয়টি কোয়েরি চলেছে এবং তা কত সময় নিয়েছে।


২. ফেচ টাইপ এবং অ্যাসোসিয়েশন (Fetch Types and Associations)

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

দুটি টেবিলের মধ্যে যখন সম্পর্ক থাকে (যেমন: একজন প্লেয়ার এবং তার অনেকগুলো টুর্নামেন্ট), তখন ডাটা কীভাবে আসবে তা ঠিক করাই হলো ফেচ টাইপ।

  • Lazy Fetching: ডাটা তখনই আসবে যখন আপনার কোড তা চাইবে। এটি ভালো কারণ অপ্রয়োজনীয় ডাটা লোড হয় না।

  • Eager Fetching: মেইন ডাটা লোড হওয়ার সাথে সাথেই তার সাথে যুক্ত সব ডাটা চলে আসবে। এটি অনেক সময় সিস্টেম স্লো করে দেয়।

পরামর্শ: সবসময় @OneToMany বা @ManyToMany এর ক্ষেত্রে Lazy ব্যবহার করা উচিত।


৩. N+1 সিলেক্ট সমস্যা এবং সমাধান (N+1 Select Issue & Solutions)

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

এটি Spring Data JPA-এর সবচেয়ে পরিচিত সমস্যা। মনে করুন, আপনি ২০ জন প্লেয়ারের লিস্ট চাইলেন (১টি কোয়েরি)। এখন লুপ চালিয়ে প্রতি প্লেয়ারের টুর্নামেন্টের নাম প্রিন্ট করতে গিয়ে হিবারনেট আরও ২০টি কোয়েরি চালাল। মোট ১+২০=২১টি কোয়েরি! এটাই N+1 সমস্যা।

সমাধান ১: Join Fetch

Java

@Query("SELECT p FROM Player p LEFT JOIN FETCH p.tournaments WHERE p.name = :name")
List<Player> findByNameWithTournaments(String name); 
  • কেন ব্যবহার করব: এই কোডটি একটি সিঙ্গেল কোয়েরির মাধ্যমেই প্লেয়ার এবং টুর্নামেন্টের সব ডাটা নিয়ে আসবে। আলাদা করে বারবার ডাটাবেসে যেতে হবে না।

সমাধান ২: Entity Graph

Java

@EntityGraph(attributePaths = {"tournaments"})
List<Player> findAll(); 
  • কেন ব্যবহার করব: কোয়েরি না লিখেও অ্যানোটেশনের মাধ্যমে স্প্রিংকে বলা যায় কোন কোন ডাটা একসাথে লোড করতে হবে।

৪. সেট বনাম লিস্ট (Set vs List in Many-to-Many)

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

ভিডিওতে একটি দারুণ টিপস দেওয়া হয়েছে। @ManyToMany সম্পর্কের ক্ষেত্রে List ব্যবহার করলে হিবারনেট কোনো ডাটা ডিলিট করার সময় সব ডাটা মুছে আবার ইনসার্ট করে, যা খুবই অদক্ষ।

  • সহজ ব্যাখ্যা: আপনি যদি লিস্ট ব্যবহার করেন এবং একটি আইটেম রিমুভ করতে চান, হিবারনেট ডাটাবেসের ওই টেবিলের সব রো ডিলিট করে দেয় এবং বাকিগুলো আবার নতুন করে লেখে। কিন্তু Set ব্যবহার করলে হিবারনেট শুধুমাত্র নির্দিষ্ট ওই রোটিই ডিলিট করে।

  • আমার চিন্তাভাবনা: ডাটাবেস ডিজাইন করার সময় ডুপ্লিকেট ডাটার প্রয়োজন না থাকলে সবসময় Set ব্যবহার করা ভালো।


৫. ডিটিও প্রজেকশন (DTO Projections)

ভিডিও রেফারেন্স: [27:05]

পুরো এEntity (সব কলাম) লোড না করে শুধুমাত্র প্রয়োজনীয় কলাম (যেমন শুধু নাম) লোড করাই হলো প্রজেকশন।

  • সহজ ব্যাখ্যা: ধরুন প্লেয়ার টেবিলে ২০টি কলাম আছে, কিন্তু আপনার শুধু নাম আর ইমেইল দরকার। পুরো অবজেক্ট লোড করলে মেমোরি বেশি লাগে। ইন্টারফেস বা রেকর্ড (Record) ব্যবহার করে শুধু ওই দুটি কলাম আনা যায়।

কোড উদাহরণ (Record ব্যবহার করে):

Java

public record PlayerNameDTO(String firstName, String lastName) {}

// রিপোজিটরিতে
List<PlayerNameDTO> findByFirstName(String firstName); 

এই কোড দিয়ে কী হবে? এটি ডাটাবেস থেকে শুধু first_name এবং last_name সিলেক্ট করবে, ফলে পারফরম্যান্স বাড়বে।


এনালাইসিস এবং বাস্তবতা (Analysis & Reality)

মূল বক্তব্য: কন্টেন্ট ক্রিয়েটর Thorben Janssen মূলত এটিই বোঝাতে চেয়েছেন যে, ফ্রেমওয়ার্ক (Spring Data JPA) আমাদের কাজ সহজ করে ঠিকই, কিন্তু এর ইন্টারনাল কাজ না বুঝলে এটিই সিস্টেমের স্লো হওয়ার কারণ হয়ে দাঁড়ায়। বিশেষ করে অপ্রয়োজনীয় ডাটা লোড করা এবং অনেক বেশি কোয়েরি চালানো হলো পারফরম্যান্সের প্রধান শত্রু।

বাস্তবতার নিরিখে কিছু পরামর্শ: ১. সবসময় লগের দিকে নজর দিন: ডেভেলপমেন্টের সময় দেখুন আপনার একটি ক্লিকের কারণে ডাটাবেসে কয়টি কোয়েরি যাচ্ছে। ২. বড় ডেটার কথা ভাবুন: আপনার লোকাল কম্পিউটারে ১০টি ডাটা থাকলে যা ফাস্ট মনে হয়, প্রোডাকশনে ১ লাখ ডাটায় তা আটকে যেতে পারে। ৩. বিকল্প চিন্তা: অনেক সময় হিবারনেটের ওপর নির্ভর না করে জটিল কুয়েরির জন্য 'Native SQL' বা 'Querydsl' ব্যবহার করা আরও কার্যকর হতে পারে।

উপসংহার: অ্যাপ্লিকেশন ফাস্ট করার মানে শুধু নতুন কোড লেখা নয়, বরং ডাটাবেসের সাথে অ্যাপ্লিকেশনের যোগাযোগ কতটা স্মার্টলি হচ্ছে তা নিশ্চিত করা। উপরের কৌশলগুলো (Join Fetch, DTO, Set ব্যবহার) আপনার স্প্রিং বুট প্রজেক্টকে অনেক বেশি গতিশীল করবে।

[

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

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