জেপিএ / হাইবারনেটে ফ্লাশ () এর সঠিক ব্যবহার


110

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

এখন আমি দুটি সংস্থার সাথে Aএবং B(এক-এক-এক সম্পর্কের মধ্যে, তবে জেপিএ দ্বারা প্রয়োগ বা মডেলিং করা হয়নি) এর সাথে নিম্নলিখিত পরিস্থিতি পেয়েছি । Aএকটি যৌগিক পিকে রয়েছে, যা ম্যানুয়ালি সেট করা আছে এবং এতে একটি স্বয়ংক্রিয়ভাবে উত্পাদিত পরিচয় ক্ষেত্রও রয়েছে recordId। এই recordIdসত্তা লিখতে হবে Bএকটি বিদেশী কী-এর মত A। আমি সঞ্চয় করছি Aএবং Bএকক লেনদেনে সমস্যা হলো স্বয়ংক্রিয়ভাবে তৈরি মান A.recordIdউপলব্ধ লেনদেনের মধ্যে, যদি না আমি একটি সুনির্দিষ্ট কল করতে হয় em.flush()কলিং পর em.persist()উপর A। (যদি আমার একটি স্বতঃ-উত্পন্ন পরিচয় পিকে থাকে তবে মানটি সত্তায় সরাসরি আপডেট করা হয়, তবে এখানে মামলা হয় না))

em.flush()কোনও লেনদেনের মধ্যে ব্যবহারের সময় কোনও ক্ষতি করতে পারে?

উত্তর:


148

সম্ভবত সঠিক বিবরণগুলি em.flush()বাস্তবায়ন-নির্ভর। যাইহোক, হাইবারনেটের মতো জেপিএ সরবরাহকারীরা এসকিউএল নির্দেশাবলী যেগুলি ডেটাবেসে প্রেরণ করা উচিত তা প্রায়শই আপনি সত্যিকারের লেনদেন না করা পর্যন্ত ক্যাশে রাখতে পারেন। উদাহরণস্বরূপ, আপনি কল করেছেন em.persist(), হাইবারনেট মনে আছে এটি একটি ডাটাবেস INSERT তৈরি করতে হবে, তবে লেনদেন না করা পর্যন্ত নির্দেশটি বাস্তবে কার্যকর করে না। আফাইক, এটি মূলত পারফরম্যান্সের কারণে করা হয়।

কিছু ক্ষেত্রে আপনি এসকিউএল নির্দেশাবলী অবিলম্বে কার্যকর করাতে চান; সাধারণত যখন আপনার কিছু পার্শ্ব প্রতিক্রিয়াগুলির ফলাফল প্রয়োজন যেমন অটোজেনারেটেড কী বা ডেটাবেস ট্রিগার।

কি em.flush()করে অভ্যন্তরীণ এসকিউএল নির্দেশাবলী ক্যাশে খালি, এবং ডাটাবেসের সাথে অবিলম্বে এটি চালানো হয়।

নীচের লাইন: কোনও ক্ষতি করা হবে না, কেবলমাত্র আপনি (অপ্রাপ্তবয়স্ক) পারফরম্যান্স হিট করতে পারেন যেহেতু আপনি জেপিএ সরবরাহকারীর সিদ্ধান্তগুলি ডাটাবেসে এসকিউএল নির্দেশনা প্রেরণের সেরা সময়কে বিবেচনা করছেন।


1
সে কি বললো. em.flush () আচরণ java.io.Flushable.flush () প্রতিধ্বনিত করে যেখানে সমস্ত বাফার ডেটা যে কোনও গন্তব্যস্থলে যথাযথভাবে প্রেরণ করা হয়।
এরিক

4
যদি ফ্লাশ () ডাটাবেসে ডেটা প্রেরণ করে? তার পরে যদি ব্যতিক্রম ছুঁড়ে দেওয়া হয় তবে কী হবে? সত্তা পরিচালক কি সবকিছু রোলব্যাক করবেন? এমনকি প্রথম ফ্লাশে লেখা ডেটা?
জাইমে হাবলুটজেল

101
ফ্লাশ () এসএসকিউএল নির্দেশাবলী ইনসার্ট, আপডেট আপডেট ইত্যাদির মতো ডেটাবেজে প্রেরণ করে এটি কোনও কমিট প্রেরণ করবে না, সুতরাং ফ্লাশ () এর পরে যদি আপনার ব্যতিক্রম থাকে তবে আপনার এখনও সম্পূর্ণ রোলব্যাক থাকতে পারে।
ফ্ল্যাভিও

17
আপনি ডিবি রোলব্যাক করতে পারেন, তবে এটি অবজেক্টগুলিতে কোনও পরিবর্তন যেমন রোলব্যাক করবে না, যেমন, স্বয়ং-বর্ধিত 'সংস্করণ', অটোজেনারেটেড আইডি ইত্যাদি Furthermore এছাড়াও সত্তা পরিচালকটি রোলব্যাকের পরে বন্ধ হয়ে যাবে। শুধু সাবধান হন যে আপনি যদি অন্য সেশনে এই অবজেক্টটি 'মার্জ' করার চেষ্টা করেন, বিশেষত স্বয়ংক্রিয়ভাবে বর্ধিত 'সংস্করণ' একটি অপটিমাস্টিকলক এক্সেকশন হতে পারে।
পিটার ডেভিস

11
পার্শ্ব প্রতিক্রিয়াগুলি ট্রিগার করা ছাড়াও ফ্লাশ () ব্যবহারের আরেকটি কারণ হ'ল আপনি যদি জেপিকিউএল / এইচকিউএল (উদাহরণস্বরূপ একটি পরীক্ষায়) ব্যবহার করে ডেটাবেজে কোনও ক্রিয়াকলাপের প্রভাব পড়তে সক্ষম হতে চান। এই কোয়েরিগুলি সম্পাদন করার সময় জেপিএ ক্যাশেড ডেটা ব্যবহার করতে পারে না, সুতরাং কেবলমাত্র ডিবিতে থাকা স্টাফগুলিই কেবল পড়তে হবে।
sleske

2

আসলে, em.flush()ক্যাশেড এসকিউএল কমান্ডগুলি প্রেরণ করার চেয়ে আরও বেশি কিছু করুন। এটি অন্তর্নিহিত ডাটাবেসে স্থিরতা প্রসঙ্গে সিঙ্ক্রোনাইজ করার চেষ্টা করে। যদি আপনার ক্যাশে সংগ্রহগুলি সিঙ্ক্রোনাইজ করা থাকে তবে এটি আপনার প্রক্রিয়াগুলিতে প্রচুর সময় ব্যয় করতে পারে।

এটি ব্যবহার সম্পর্কে সতর্কতা।


1

Em.flush () কোনও লেনদেনের মধ্যে ব্যবহারের সময় কোনও ক্ষতি করতে পারে?

হ্যাঁ, এটি প্রয়োজনের চেয়ে দীর্ঘ সময়ের জন্য ডাটাবেসে লক ধরে রাখতে পারে।

সাধারণত, জেপিএ ব্যবহার করার সময় আপনি পাত্রে লেনদেন পরিচালনার প্রতিনিধিত্ব করেন (ওরফে সিএমটি - ব্যবসায়িক পদ্ধতিতে @ ট্রান্সঅ্যাকশনাল টিকা ব্যবহার করে) যার অর্থ কোনও পদ্ধতিতে প্রবেশের সময় একটি লেনদেন স্বয়ংক্রিয়ভাবে শুরু হয়ে যায় এবং শেষে / ঘুরে ফিরে আসে। আপনি যদি অটিটিম্যানেজারকে ডাটাবেস সিঙ্ক্রোনাইজেশন পরিচালনা করতে দেন, সিক্যালি স্টেটমেন্ট এক্সিকিউশনটি কমিটের ঠিক আগেই ট্রিগার করা হবে, যার ফলে ডাটাবেসে স্বল্পকালীন লক হয়। অন্যথায় আপনার ম্যানুয়ালি ফ্লাশ করা রাইট ক্রিয়াকলাপগুলি ম্যানুয়াল ফ্লাশ এবং স্বয়ংক্রিয় প্রতিশ্রুতিগুলির মধ্যে লক ধরে রাখতে পারে যা বাকি পদ্ধতি কার্যকর করার সময় অনুযায়ী দীর্ঘ হতে পারে।

নোটস যে কিছু অপারেশন স্বয়ংক্রিয়ভাবে ফ্লাশকে ট্রিগার করে: একই অধিবেশনটির বিরুদ্ধে নেটিভ কোয়েরি সম্পাদন করা (এসকিউএল কোয়েরি দ্বারা প্রেরণীয় হওয়ার জন্য EM রাজ্য অবশ্যই প্রবাহিত করতে হবে), দেশীয় উত্পন্ন আইডি ব্যবহার করে সত্তা সন্নিবেশ করানো (ডাটাবেস দ্বারা উত্পন্ন, সুতরাং সন্নিবেশ বিবৃতি অবশ্যই হবে) ট্রিগারযুক্ত এমএম উত্পন্ন আইডি পুনরুদ্ধার করতে এবং সম্পর্কগুলি সঠিকভাবে পরিচালনা করতে সক্ষম হয়)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.