দীর্ঘ বিবরণের জন্য, আপনি আমার ওপেন সেশনটি এন্টি-প্যাটার্ন নিবন্ধটি দেখুনতে পড়তে পারেন । অন্যথায়, কেন আপনার ভিউতে ওপেন সেশন ব্যবহার করা উচিত নয় তার একটি সংক্ষিপ্তসার এখানে।
ওপেন সেশন ভিউতে ডেটা আনার জন্য খারাপ দৃষ্টিভঙ্গি লাগে। ব্যবসায়ের স্তরটি ভিউ স্তরের দ্বারা প্রয়োজনীয় সমস্ত সংঘগুলি কীভাবে নেওয়া ভাল তা স্থির করার পরিবর্তে এটি দৃistence়তা প্রসঙ্গে খোলার জন্য বাধ্য করে যাতে ভিউ স্তরটি প্রক্সি সূচনাটি ট্রিগার করতে পারে।
OpenSessionInViewFilter
কল openSession
অন্তর্নিহিত পদ্ধতি SessionFactory
এবং একটি নতুন সংগ্রহ Session
।
Session
আবদ্ধ হয় TransactionSynchronizationManager
।
OpenSessionInViewFilter
কল doFilter
এর javax.servlet.FilterChain
অবজেক্ট রেফারেন্স এবং অনুরোধ আরও প্রক্রিয়াকৃত হয়
DispatcherServlet
বলা হয়, এবং অন্তর্নিহিত তা যাত্রাপথ HTTP অনুরোধ PostController
।
PostController
কল PostService
একটি তালিকা পেতে Post
সত্ত্বা।
PostService
একটি নতুন লেনদেনের খুলে দেয়, আর HibernateTransactionManager
একই reuses Session
যে খোলা ছিল OpenSessionInViewFilter
।
PostDAO
তালিকা নিয়ে আসে Post
কোন অলস সমিতি আরম্ভের ছাড়া সত্ত্বা।
PostService
অন্তর্নিহিত লেনদেনের করে, কিন্তু Session
বন্ধ হয়নি, কারণ এটি বাহ্যিকভাবে খোলা হয়।
DispatcherServlet
শুরু UI 'তে, যা, ঘুরে, অলস সমিতির নেভিগেট করে এবং তাদের আরম্ভের আরম্ভ করে রেন্ডারিং।
OpenSessionInViewFilter
বন্ধ করে দিতে পারেন Session
, এবং অন্তর্নিহিত ডাটাবেস সংযোগ পাশাপাশি উন্মুক্ত করা হয়েছে।
প্রথম নজরে, এটি করার মতো ভয়ঙ্কর জিনিসটির মতো নাও লাগতে পারে, তবে আপনি এটি একবার ডেটাবেস দৃষ্টিকোণ থেকে দেখলে সিরিজ ত্রুটিগুলি আরও স্পষ্ট হয়ে উঠতে শুরু করে।
পরিষেবা স্তরটি একটি ডাটাবেস লেনদেনটি খোলে এবং বন্ধ করে, তবে এর পরে, কোনও স্পষ্ট লেনদেন চলছে না। এই কারণে, ইউআই রেন্ডারিং পর্ব থেকে প্রকাশিত প্রতিটি অতিরিক্ত বিবৃতি অটো-কমিট মোডে কার্যকর করা হয়। অটো-কমিট ডাটাবেস সার্ভারে চাপ দেয় কারণ প্রতিটি বিবৃতি অবশ্যই লেনদেন লগকে ডিস্কে ফ্লাশ করে, সুতরাং ডাটাবেস সাইডে প্রচুর I / O ট্র্যাফিক সৃষ্টি করে। একটি অপ্টিমাইজেশন হ'ল Connection
কেবল পঠনযোগ্য হিসাবে চিহ্নিত করা যা ডাটাবেস সার্ভারকে লেনদেনের লগতে লেখা এড়াতে দেয়।
আর উদ্বেগের কোনও বিচ্ছেদ নেই কারণ পরিষেবা লেয়ার এবং ইউআই রেন্ডারিং প্রক্রিয়া উভয় দিয়ে বিবৃতি উত্পন্ন হয়। ইন্টিগ্রেশন টেস্টগুলি লেখার জন্য যা জেনারেট হওয়া স্টেটমেন্টের সংখ্যাটি দৃ .় করে তোলে ওয়েব কন্টেইনারটিতে অ্যাপ্লিকেশন স্থাপনের সময় সমস্ত স্তর (ওয়েব, পরিষেবা, ডিএও) দিয়ে যাওয়া প্রয়োজন। এমনকি ইন-মেমোরি ডাটাবেস (যেমন এইচএসকিউএলডিবি) এবং লাইটওয়েট ওয়েব সার্ভার ব্যবহার করার সময় (যেমন জেটি), স্তরগুলি পৃথক করা হয়েছিল এবং ব্যাক-এন্ড ইন্টিগ্রেশন পরীক্ষাগুলি ডাটাবেস ব্যবহার করেছিল তার চেয়ে এই ইন্টিগ্রেশন পরীক্ষাগুলি কার্যকর করতে ধীর হতে চলেছে the ফ্রন্ট-এন্ড ইন্টিগ্রেশন পরীক্ষাগুলি পুরোপুরি পরিষেবা স্তরকে উপহাস করছিল।
ইউআই স্তরটি নেভিগেট সংঘের মধ্যে সীমাবদ্ধ যা ঘুরেফিরে N + 1 ক্যোয়ারী সমস্যাগুলি ট্রিগার করতে পারে। যদিও হাইবারনেট @BatchSize
ব্যাচে অ্যাসোসিয়েশন আনার জন্য প্রস্তাব দেয় এবং FetchMode.SUBSELECT
এই পরিস্থিতিটি মোকাবেলা করার জন্য, টীকাগুলি ডিফল্ট আনয়ন পরিকল্পনাটিকে প্রভাবিত করে, তাই তারা প্রতিটি ব্যবসায়িক ব্যবহারের ক্ষেত্রে প্রয়োগ হয়। এই কারণে, একটি ডেটা অ্যাক্সেস লেয়ার ক্যোয়ারী অনেক বেশি উপযুক্ত কারণ এটি বর্তমান ব্যবহারের ক্ষেত্রে ডেটা আনার প্রয়োজনীয়তার জন্য উপযুক্ত হতে পারে।
সর্বশেষে তবে সর্বনিম্ন নয়, ইউআই রেন্ডারিং পর্যায়ে (আপনার সংযোগ রিলিজ মোডের উপর নির্ভর করে) ডাটাবেস সংযোগটি অনুষ্ঠিত হতে পারে যা সংযোগ ইজারা সময়কে বৃদ্ধি করে এবং ডাটাবেস সংযোগ পুলের ভিড়ের কারণে সামগ্রিক লেনদেনের থ্রুটপুটকে সীমাবদ্ধ করে। সংযোগটি যত বেশি অনুষ্ঠিত হবে তত বেশি অন্যান্য সমবর্তী অনুরোধগুলি পুল থেকে সংযোগ পেতে অপেক্ষা করতে চলেছে।
সুতরাং, হয় আপনি সংযোগটি দীর্ঘ সময়ের জন্য আটকে রাখেন, হয় আপনি একক এইচটিটিপি অনুরোধের জন্য একাধিক সংযোগ অর্জন / প্রকাশ করেন, অতএব অন্তর্নিহিত সংযোগ পুলে চাপ দিন এবং স্কেলিবিলিটি সীমাবদ্ধ করুন।
স্প্রিং বুট
দুর্ভাগ্যক্রমে, ওপেন সেশন ভিউতে স্প্রিং বুটে ডিফল্টরূপে সক্ষম করা হয়েছে ।
সুতরাং, application.properties
কনফিগারেশন ফাইলটিতে আপনার নিম্নলিখিত প্রবেশদ্বার রয়েছে তা নিশ্চিত করুন:
spring.jpa.open-in-view=false
এটি ওএসআইভি অক্ষম করবে, যাতে আপনি সঠিক উপায়ে পরিচালনাLazyInitializationException
করতে পারেন ।