হাইবারনেটে সেশন.ফ্লুশ () এর ব্যবহার কী


110

যখন আমরা একটি রেকর্ড আপডেট করি, আমরা session.flush()হাইবারনেট দিয়ে ব্যবহার করতে পারি । কী দরকার flush()?

উত্তর:


138

সেশন ফ্লাশিং হাইবারনেটকে মেমরির ইন-মেমরি অবস্থাকে Sessionডাটাবেসের সাথে সিঙ্ক্রোনাইজ করতে বাধ্য করে (অর্থাত্ ডাটাবেসে পরিবর্তন লিখতে)। ডিফল্টরূপে, হাইবারনেট আপনার জন্য স্বয়ংক্রিয়ভাবে পরিবর্তনগুলি ফ্লাশ করবে:

  • কিছু জিজ্ঞাসা মৃত্যুদণ্ড কার্যকর করার আগে
  • যখন কোনও লেনদেন প্রতিশ্রুতিবদ্ধ হয়

স্পষ্টভাবে ফ্ল্যাশ করার অনুমতি Sessionদেয় কিছু সূক্ষ্ম নিয়ন্ত্রণ যা কিছু পরিস্থিতিতে প্রয়োজন হতে পারে (একটি আইডি নির্ধারিত করতে, সেশনের আকার নিয়ন্ত্রণ করতে ...)।


8
মনে রাখবেন যে এই উত্তরটি ডিফল্ট হাইবারনেট আচরণের বর্ণনা দেয়: ফ্লাশ মোড সেটিংসের মাধ্যমে ফ্লাশ আচরণটি পরিবর্তন করা যেতে পারে। বিশদগুলি ডকস.জেবোস.আর.এস . / হাইবারনেট / হরমোন / ৩.৫ / এপি / জর্ / হাইবারনেট /… (সংস্করণ ৩.৩ ) এ রয়েছে।
স্টিভটি

1
আমি দস্তাবেজটি পেয়েছি যেখানে এটি আপনি যা বলছেন ঠিক বলেছেন তবে আমার প্রশ্ন রয়েছে যে অগ্রাধিকারটি কী হবে মানে ধরুন 1) আমার ক্লাস রয়েছে যেখানে আমি কোড ব্যবহার করে অবজেক্টটি সংরক্ষণ করছি id = session.save(obj);এবং লেনদেন খুব পরের লাইনে প্রতিশ্রুতিবদ্ধ কিন্তু আপত্তি সংরক্ষণ করা হচ্ছে না ডিবি, কেন? 2) আমি session.save(obj);প্রতিশ্রুতিবদ্ধ ব্যবহার করে আপত্তি সংরক্ষণ করেছি এবং ফিরে আসার সময় আমি ব্যবহার করেছি return obj.getprimaryID();ডিজে-তে সংরক্ষণ করা হবে saved তাহলে কেন এমন আচরণ হচ্ছে?
আমোঘ

74

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

এটি 2 এসকিউএল কমান্ড সেশন খোলার মতোই। এবং 1 সেশনে করা পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ না হওয়া পর্যন্ত অন্যদের কাছে দৃশ্যমান নয়।


12
ভাল - পরিবর্তনগুলি কিছুটা দৃশ্যমান হতে পারে। উদাহরণস্বরূপ, একটি নিরীক্ষিত সারি butোকানো তবে অনির্ধারিত সারিটিতে একটি লক তৈরি করতে পারে এবং লেনদেন প্রতিশ্রুতিবদ্ধ বা ঘূর্ণিত-ব্যাক না হওয়া পর্যন্ত একই সারিটি অন্য সেশনের মাধ্যমে সন্নিবেশ করায় বিলম্ব করতে পারে। সুতরাং এটি সম্পূর্ণ অদৃশ্য নয়।
rghome

2
আমি সমস্ত ওয়েব জুড়ে সার্ফ করেছি এবং এটিই উত্তর যা শেষ পর্যন্ত আমাকে তা পেতে বাধ্য করে। ধন্যবাদ।
সিদ্ধার্থ

লুপের জন্য .flush () লাগাতে কী ব্যবহার হয় তবে যদি প্রতিশ্রুতিবদ্ধ () শেষে ফ্লাশ করে?
ইলডোসা

@ কৌশিক লেলে ফ্লাশের পরে কী তথ্য আছে () যদি ফ্লাশের পরে ডেটা না দেখা যায়? আপনি যে কিছু সূক্ষ্ম ব্যবহারের ক্ষেত্রে এটি কার্যকর হয় সেগুলির বিস্তারিত ব্যাখ্যা করতে পারেন?
java_geek

28

আমি কেবল জানি যে যখন আমরা কল করি তখন session.flush()আমাদের বিবৃতি ডাটাবেসে কার্যকর হয় তবে প্রতিশ্রুতিবদ্ধ হয় না।

ধরুন আমরা flush()সেশন অবজেক্টে পদ্ধতিটি কল করি না এবং আমরা যদি কমিট পদ্ধতিটি কল করি তবে এটি অভ্যন্তরীণভাবে ডাটাবেজে বিবৃতি কার্যকর করার এবং তারপরে প্রতিশ্রুতিবদ্ধতার কাজটি করবে।

commit=flush+commit (কার্যকারিতা ক্ষেত্রে)

সুতরাং, আমি এই সিদ্ধান্তে পৌঁছেছি যে যখন আমরা সেশন অবজেক্টে মেথড ফ্লাশ () বলি, তখন এটি কমিট হয় না তবে ডাটাবেস হিট করে কোয়েরি চালায় এবং রোলব্যাকও পায়।

প্রতিশ্রুতিবদ্ধতার জন্য আমরা লেনদেন অবজেক্টে কমিট () ব্যবহার করি।


ফ্লাশের প্রয়োজন কী সম্পর্কে আপনি কিছু বিশদ দিতে পারেন?
java_geek

14

সেশন ফ্লাশিং সেশনে থাকা ডেটা পায় যা বর্তমানে ডাটাবেসে থাকা সামগ্রীর সাথে সিঙ্ক্রোনাইজ হয়।

হাইবারনেট ওয়েবসাইটে আরও:

flush()দরকারী, কারণ সেশনটি কখন জেডিবিসি কলগুলি কার্যকর করে সে সম্পর্কে কোনও গ্যারান্টি নেই, কেবলমাত্র যে আদেশে তারা কার্যকর করা হয় - আপনি ব্যবহার ব্যতীত flush()


ব্যবহারকারীর ক্রম সম্পর্কে চিন্তা করা উচিত যখন আপনি একটি দৃশ্য প্রদান করতে পারেন? হাইবারনেটের ব্যবহার হ'ল ডিবি সম্পর্কিত জিনিসগুলি ব্যবহারকারীর কাছে স্বচ্ছ করে তোলা। যখন আমরা "প্রতিশ্রুতিবদ্ধ" করি, ফ্লাশিং স্বয়ংক্রিয়ভাবে ঘটে। আপনি দৃush়প্রতিজ্ঞ করতে হবে কিন্তু প্রতিশ্রুতিবদ্ধ না যেখানে পরিস্থিতি কি?
কৌশিক লেলে

1
@KaushikLele আপনি যদি এই প্রশ্নের পাঠাতে পারেন stackoverflow.com/questions/37382872/...
GMsoF

10

আপনি flushলেনদেন প্রতিশ্রুতিবদ্ধ হওয়ার পরিবর্তে বৈধতার সীমাবদ্ধতাগুলিকে জোর করে ব্যবহার করে কোনও পরিচিত জায়গায় সনাক্ত করতে এবং সনাক্ত করতে পারেন use এটি হতে পারে যে commitকিছু ফ্রেমওয়ার্ক যুক্তি দ্বারা, ঘোষণামূলক যুক্তি, ধারক বা কোনও টেম্পলেট দ্বারা স্পষ্টভাবে ডাকা হয়। এই ক্ষেত্রে, নিক্ষিপ্ত কোনও ব্যতিক্রম ধরা এবং পরিচালনা করা কঠিন হতে পারে (এটি কোডে খুব বেশি হতে পারে)।

উদাহরণস্বরূপ, যদি আপনি save()কোনও নতুন ইমেল ঠিকানা ঠিকানা, যা ঠিকানায় অনন্য বাধা রয়েছে, আপনি প্রতিশ্রুতি না দেওয়া পর্যন্ত ত্রুটি পাবেন না।

কলিং flush()সারিটি সন্নিবেশ করানোর জন্য জোর করে, যদি কোনও সদৃশ থাকে তবে একটি ব্যতিক্রম ছুঁড়ে ফেলে।

তবে ব্যতিক্রমের পরে আপনাকে সেশনটি পিছনে ফিরে যেতে হবে।


4

আমি কেবল উপরে বর্ণিত সমস্ত উত্তরগুলি ক্লাব করতে চাই এবং সেশন.সেভ () এর সাথে ফ্লাশ () পদ্ধতিটিও যুক্ত করব যাতে আরও গুরুত্ব দেওয়া যায়

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

ফ্লাশ (): সেশনটি ফ্লাশ করতে বাধ্য করে। এটি ডাটাবেসের সাথে সেশন ডেটা সিঙ্ক্রোনাইজ করতে ব্যবহৃত হয়।

আপনি সেশন.ফ্লুশ () কল করার সময়, বিবৃতিগুলি ডাটাবেসে কার্যকর করা হয় তবে তা প্রতিশ্রুতিবদ্ধ হবে না। যদি আপনি সেশন.ফ্লুশ () না কল করেন এবং আপনি সেশন ডটমিট () কল করেন তবে অভ্যন্তরীণভাবে প্রতিশ্রুতিবদ্ধ () পদ্ধতিটি বিবৃতি কার্যকর করে এবং প্রতিশ্রুতিবদ্ধ।

সুতরাং কমিট () = ফ্লাশ + কমিট। সুতরাং সেশন.ফ্লুশ () কেবল ডাটাবেসে স্টেটমেন্টগুলি কার্যকর করে (তবে কমিট করে না) এবং স্টেটমেন্টগুলি আর স্মরণে নেই Y এটি সেশনটি ফ্লাশ করতে বাধ্য করে।

কয়েকটি গুরুত্বপূর্ণ বিষয়:

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


3

flush() পদ্ধতি অধিবেশন ঘনিষ্ঠরূপে হাইবারনেট ঘটায়। setFlushMode()পদ্ধতিটি ব্যবহার করে আপনি সেশনটির জন্য ফ্লাশিং মোড ব্যবহার করতে হাইবারনেটটি কনফিগার করতে পারেন । বর্তমান সেশনের জন্য ফ্লাশ মোডটি পেতে, আপনি getFlushMode()পদ্ধতিটি ব্যবহার করতে পারেন । সেশনটি নোংরা কিনা তা পরীক্ষা করতে আপনি isDirty()পদ্ধতিটি ব্যবহার করতে পারেন । ডিফল্টরূপে, হাইবারনেট সেশনগুলির ফ্লাশিং পরিচালনা করে।

ডকুমেন্টেশনে যেমন বলা হয়েছে:

https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/flushing/Flushing.html

অনিদ্রা

ফ্লাশিং হ'ল অন্তর্নিহিত ডাটাবেসের সাথে অধ্যবসায়ের প্রেক্ষাপটের স্থিতিকে সিঙ্ক্রোনাইজ করার প্রক্রিয়া। EntityManagerএবং হাইবারনেট Sessionপদ্ধতি একটি সেট, যার মাধ্যমে আবেদন ডেভেলপার কোনো সত্তার এর ক্রমাগত রাষ্ট্র পরিবর্তন করতে পারেন এক্সপোজ।

অধ্যবসায় প্রসঙ্গটি কোনও সত্তার স্থিতির পরিবর্তনে সারিবদ্ধভাবে লেনদেনমূলক লিখনের পিছনে ক্যাশে হিসাবে কাজ করে। কোনও লিখিত-পিছনের ক্যাশের মতো, পরিবর্তনগুলি প্রথমে মেমোরিতে প্রয়োগ করা হয় এবং ফ্লাশের সময় ডাটাবেসের সাথে সিঙ্ক্রোনাইজ করা হয়। ফ্লাশ অপারেশন প্রত্যেক সত্তা স্থিতি পরিবর্তন নেয় এবং একটি থেকে এটি অনুবাদ করে INSERT, UPDATEবা DELETEবিবৃতি।

ফ্লাশিং কৌশলটি বর্তমান চলমান হাইবারনেট সেশনের ফ্লাশমোড দ্বারা দেওয়া হয়েছে । যদিও জেপিএ কেবল দুটি ফ্লাশিং কৌশল ( AUTOএবং COMMIT) সংজ্ঞায়িত করেছে, হাইবারনেট ফ্লাশ প্রকারের আরও বিস্তৃত বর্ণালী রয়েছে:

  • ALWAYS: প্রতিটি প্রশ্নের আগে সেশনটি ফ্লাশ করে;
  • AUTO: এটি ডিফল্ট মোড এবং এটি প্রয়োজনীয় হলে সেশনটি ফ্লাশ করে;
  • COMMIT: বর্তমান ট্রানজেকশন প্রতিশ্রুতি না দেওয়া পর্যন্ত অধিবেশন ফ্লাশকে বিলম্বিত করার চেষ্টা করে, যদিও এটি অকাল সময়ের আগেও ফ্লাশ হতে পারে;
  • MANUAL: সেশন ফ্লাশিং অ্যাপ্লিকেশনটিতে প্রেরণ করা হয়, যা Session.flush()দৃ pers়তা প্রসঙ্গে পরিবর্তনগুলি প্রয়োগ করতে অবশ্যই স্পষ্টভাবে কল করতে হবে ।

ডিফল্টরূপে, হাইবারনেট AUTOফ্লাশ মোড ব্যবহার করে যা নিম্নলিখিত পরিস্থিতিতে একটি ফ্লাশকে ট্রিগার করে:

  • লেনদেন করার আগে;
  • জেপিকিউএল / এইচকিউএল কোয়েরি কার্যকর করার আগে যা সারিবদ্ধ সত্তা ক্রিয়াকলাপগুলির সাথে ওভারল্যাপ করে;
  • কোনও নেটিভ সিঙ্ক্রোনাইজেশন নেই এমন কোনও নেটিভ এসকিউএল কোয়েরি কার্যকর করার আগে।

1

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


0

এই পদ্ধতির সাহায্যে আপনি ফ্লাশ প্রক্রিয়া শুরু করুন। এই প্রক্রিয়াটি রাষ্ট্রীয় পরিবর্তনগুলি সনাক্ত করে এবং সম্পর্কিত এসকিউএল স্টেটমেন্টগুলি সম্পাদন করে আপনার সেশনের স্থিতির সাথে আপনার ডাটাবেসের স্থিতিকে সিঙ্ক্রোনাইজ করে।

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