ওএসআইভি অ্যান্টি-প্যাটার্ন
ভিউ স্তর দ্বারা প্রয়োজনীয় সমস্ত সংঘগুলি কীভাবে গ্রহণ করা সর্বোত্তমভাবে ব্যবসায়ের স্তরটিকে তা না দেওয়ার পরিবর্তে, ওএসআইভি (ভিউতে ওপেন সেশন) দৃ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কেবল পঠনযোগ্য হিসাবে চিহ্নিত করা যা ডাটাবেস সার্ভারকে লেনদেনের লগতে লেখা এড়াতে দেয়।
আর উদ্বেগের কোনও বিচ্ছেদ নেই কারণ পরিষেবা লেয়ার এবং ইউআই রেন্ডারিং প্রক্রিয়া উভয় থেকেই বিবৃতি উত্পন্ন হয়। ইন্টিগ্রেশন টেস্টগুলি লেখার জন্য যা উত্পন্ন হওয়া বিবৃতিগুলির সংখ্যা দৃsert় করে তোলে কোনও ওয়েব ধারকটিতে অ্যাপ্লিকেশন স্থাপনের সময় সমস্ত স্তর (ওয়েব, পরিষেবা, ডিএও) দিয়ে যাওয়া প্রয়োজন। এমনকি ইন-মেমোরি ডাটাবেস ব্যবহার করার সময় (যেমন এইচএসকিউএলডিবি) এবং একটি লাইটওয়েট ওয়েব সার্ভার (যেমন জেটি), স্তরগুলি পৃথক করা হয় এবং ব্যাক-এন্ড ইন্টিগ্রেশন পরীক্ষাগুলি ডাটাবেস ব্যবহার করে তবে এই সংহতকরণ পরীক্ষাগুলি কার্যকর করতে ধীর হতে চলেছে the ফ্রন্ট-এন্ড ইন্টিগ্রেশন পরীক্ষাগুলি পুরোপুরি পরিষেবা স্তরকে ঠাট্টা করে।
ইউআই স্তরটি নেভিগেট সংঘের মধ্যে সীমাবদ্ধ যা ঘুরেফিরে N + 1 ক্যোয়ারী সমস্যাগুলি ট্রিগার করতে পারে । যদিও হাইবারনেট অফার করে@BatchSize ব্যাচে অ্যাসোসিয়েশন আনার জন্য এবং FetchMode.SUBSELECTএই পরিস্থিতিটি মোকাবেলা করার জন্য, টীকাগুলি ডিফল্ট আনয়ন পরিকল্পনাটিকে প্রভাবিত করে, তাই তারা প্রতিটি ব্যবসায়িক ব্যবহারের ক্ষেত্রে প্রয়োগ হয়। এই কারণে, একটি ডেটা অ্যাক্সেস লেয়ার ক্যোয়ারী অনেক বেশি উপযুক্ত কারণ এটি বর্তমান ব্যবহারের ক্ষেত্রে ডেটা আনতে প্রয়োজনীয়তার সাথে উপযুক্ত হতে পারে।
সর্বশেষে তবে সর্বনিম্ন নয়, ডাটাবেস সংযোগটি পুরো ইউআই রেন্ডারিং পর্বে জুড়ে থাকে যা সংযোগ ইজারা সময় বাড়ায় এবং ডাটাবেস সংযোগ পুলের ভিড়ের কারণে সামগ্রিক লেনদেনের থ্রুটপুটকে সীমাবদ্ধ করে। সংযোগটি যত বেশি অনুষ্ঠিত হবে তত বেশি অন্যান্য সমবর্তী অনুরোধগুলি পুল থেকে সংযোগ পেতে অপেক্ষা করতে চলেছে।
স্প্রিং বুট এবং ওএসআইভি
দুর্ভাগ্যক্রমে, ওএসআইভি (দেখুন ওপেন সেশন) স্প্রিং বুটে ডিফল্টরূপে সক্ষম হয়েছে এবং ওএসআইভি একটি পারফরম্যান্স এবং স্কেলিবিলিটি দৃষ্টিকোণ থেকে সত্যই একটি খারাপ ধারণা ।
সুতরাং, application.propertiesকনফিগারেশন ফাইলটিতে আপনার নিম্নলিখিত প্রবেশদ্বার রয়েছে তা নিশ্চিত করুন:
spring.jpa.open-in-view=false
এই OSIV যাতে আপনি করতে পারেন নিষ্ক্রিয় করা হবে হ্যান্ডেল LazyInitializationExceptionসঠিক ভাবে ।
সংস্করণ ২.০ দিয়ে শুরু করে, ওএসআইভিটি ডিফল্টরূপে সক্ষম করা হলে স্প্রিং বুট একটি সতর্কতা জারি করে, সুতরাং এটি কোনও প্রোডাকশন সিস্টেমে প্রভাবিত হওয়ার আগেই আপনি এই সমস্যাটি আবিষ্কার করতে পারেন।
ওএসআইভি সম্পর্কে আরও তথ্যের জন্য, এই নিবন্ধটি দেখুন ।