স্প্রিং বুটে এই বসন্ত.jpa.open-in-view = আসল সম্পত্তিটি কী?


121

আমি spring.jpa.open-in-view=trueজেপিএ কনফিগারেশনের জন্য স্প্রিং বুট ডকুমেন্টেশনে সম্পত্তি দেখেছি ।

  • trueযদি এই সম্পত্তিটি একেবারেই সরবরাহ না করা হয় তবে এটির জন্য কি ডিফল্ট মান ?;
  • এটি আসলে কী করে? আমি এর পক্ষে ভাল কোনও ব্যাখ্যা পাইনি;
  • এটি আপনাকে SessionFactoryপরিবর্তে ব্যবহার করে তোলে EntityManagerFactory? যদি হ্যাঁ, তবে আমি কীভাবে এটির EntityManagerFactoryপরিবর্তে আমাকে ব্যবহারের অনুমতি দিতে পারি ?

ধন্যবাদ!

উত্তর:


52

এই সম্পত্তিটিতে একটি নিবন্ধীকৃত হবে OpenEntityManagerInViewInterceptor, যা EntityManagerবর্তমান থ্রেডে একটি নিবন্ধিত করে , তাই EntityManagerওয়েব অনুরোধ শেষ না হওয়া পর্যন্ত আপনার একই রকম থাকবে। হাইবারনেট SessionFactoryইত্যাদির সাথে এর কোনও যোগসূত্র নেই etc.


ওয়েব অনুরোধ শেষ না হওয়া অবধি সত্তা ম্যানেজারটি নিয়ন্ত্রণ করতে আমার কাছে ফিল্টার ওপেনসেন্টি ম্যানেজারআইভ্যুফিল্টার রয়েছে। এই ইন্টারসেপ্টরটি আপনি "ওপেনএটিটি ম্যানেজারইনভিউইনটারসেপ্টর" বোঝাতে চেয়েছিলেন "ওপেনটিটিম্যানেজারআইএনভিউফিল্টার"? তাদের মধ্যে পার্থক্য কী? সুতরাং, স্প্রিং বুটের জন্য আমার সার্লেলেট প্রসঙ্গে আরও এই ফিল্টারটি আমার কাছে নেই?
কার্লোস আলবার্তো

1
ইন্টারসেপ্টরটি কেবল তখনই কাজ করে, যখন আপনি বসন্তে ডিসপ্যাচার সার্ভলেট ব্যবহার করেন (কারণ ইন্টারসেপ্টারটি একটি বসন্ত প্রক্রিয়া)। ফিল্টারটি সমস্ত কনফিগার করা সার্লেটগুলিতে ম্যাপ করা যায় (আমরা এটি আমাদের অ্যাপ্লিকেশনগুলির একটিতে ফেসসर्ভলেটের জন্য ব্যবহার করি)। সুতরাং আপনি যদি কেবল ডিসপ্যাচার সার্ভলেট ব্যবহার করেন তবে আপনি সম্পত্তি যুক্ত করতে এবং ফিল্টারটি সরাতে পারেন, অন্যথায় ফিল্টারটি ব্যবহার করতে পারেন।
ডুনি

299

ওএসআইভি অ্যান্টি-প্যাটার্ন

ভিউ স্তর দ্বারা প্রয়োজনীয় সমস্ত সংঘগুলি কীভাবে গ্রহণ করা সর্বোত্তমভাবে ব্যবসায়ের স্তরটিকে তা না দেওয়ার পরিবর্তে, ওএসআইভি (ভিউতে ওপেন সেশন) দৃ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সঠিক ভাবে

সংস্করণ ২.০ দিয়ে শুরু করে, ওএসআইভিটি ডিফল্টরূপে সক্ষম করা হলে স্প্রিং বুট একটি সতর্কতা জারি করে, সুতরাং এটি কোনও প্রোডাকশন সিস্টেমে প্রভাবিত হওয়ার আগেই আপনি এই সমস্যাটি আবিষ্কার করতে পারেন।

ওএসআইভি সম্পর্কে আরও তথ্যের জন্য, এই নিবন্ধটি দেখুন


14
আজকাল একটি সতর্কতা লগ করা হচ্ছে।
ভ্লাদ মিহালসিয়া

এটি কি সাধারণভাবে বসন্তের ক্ষেত্রে প্রযোজ্য, বা কেবল স্প্রিং বুট? সম্পত্তি নির্ধারণের পরিবর্তে এটি কি একটি @ কনফিগারেশন-টীকাযুক্ত শ্রেণীর মাধ্যমে অক্ষম করা যেতে পারে?
গর্ডন

2
এটি কেবল স্প্রিং বুটের ক্ষেত্রে প্রযোজ্য। স্ট্যান্ডার্ড স্প্রিং-এ, আপনি কীভাবে মটরশুটি ব্যবহার করবেন বা OSIV এর মতো কোনও ওয়েব ফিল্টার চান কিনা তা আপনি স্পষ্টভাবে বেছে নিন choose আপনি কিছু টিকাশির মাধ্যমে এটি অক্ষম করতে পারবেন কিনা তা আমি জানি না। আমি শুধুমাত্র কনফিগারেশন সেটিংস জানি।
ভ্লাদ মিহলসিয়া

এটি কোনও অ্যান্টি-প্যাটার্ন নয়। এতে পারফরম্যান্সের প্রভাব থাকে, কখনও কখনও নেতিবাচক হয়, অনেক সময় বেশ নিরপেক্ষ হয় এবং অনেক ক্ষেত্রে ইতিবাচক উপায়ে হয়: আপনি যদি শুরু করতে চান তবে যদি অলস সম্পর্কটি শুরু করতে চান তবে আপনার সব ক্ষেত্রে কোয়েরি করার দরকার নেই you এবং ওপেন-ইন-ভিউ ব্যবহার করে যখন প্রয়োজন হয় তা এড়াতে পারে।
ইয়ামাজোরস

5
উইকিপিডিয়া অনুসারে, "একটি অ্যান্টি-প্যাটার্ন হ'ল একটি পুনরাবৃত্তি সমস্যাটির একটি সাধারণ প্রতিক্রিয়া যা সাধারণত অকার্যকর এবং ঝুঁকির ফলে অত্যন্ত প্রতিরোধী হয়"। ভিউতে ওপেন সেশনটি হ'ল এটি।
ভ্লাদ মিহলসিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.