এনএইচবারনেট আইশন ফ্লাশ: কোথায় এবং কখন এটি ব্যবহার করতে হবে এবং কেন?


187

জিনিসপত্র পেতে আমাকে পুঙ্খানুপুঙ্খভাবে বিভ্রান্ত এক ব্যবহার session.Flush, সাথে session.Commit, এবং session.Close

কখনও কখনও session.Closeকাজ করে, যেমন, এটি আমার প্রয়োজনীয় সমস্ত পরিবর্তনগুলি সম্পাদন করে। আমি জানি আমার যখন কোনও লেনদেন হয় তখন আমার প্রতিশ্রুতি ব্যবহার করতে হবে, বা বেশ কয়েকটি ক্রিয়েট / আপডেট / ডিলিট সহ কাজের ইউনিট ব্যবহার করতে হবে, যাতে কোনও ত্রুটি দেখা দিলে আমি রোলব্যাক বেছে নিতে পারি।

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

কোথায় বা কখন ফ্লাশ ব্যবহার করবেন সে সম্পর্কে কারও কাছে একটি ভাল গাইডলাইন রয়েছে? আমি এর জন্য এনএইচবারনেট ডকুমেন্টেশন পরীক্ষা করে দেখেছি, তবে আমি এখনও এর সরল উত্তর খুঁজে পাই না।

উত্তর:


236

সংক্ষেপে:

  1. সর্বদা লেনদেন ব্যবহার করুন
  2. ব্যবহার করবেন না Close(), পরিবর্তে একটি অন আপনার কল মোড়ানো ISessionএকটি ভিতরে usingবিবৃতি অথবা অন্য কোথাও আপনার ISession এর জীবনচক্র পরিচালনা

ডকুমেন্টেশন থেকে :

সময়ে সময়ে এটি ISessionADO.NET সংযোগের স্থিতিকে স্মৃতিতে রাখা বস্তুর রাজ্যের সাথে সিঙ্ক্রোনাইজ করার জন্য প্রয়োজনীয় এসকিউএল স্টেটমেন্টগুলি কার্যকর করবে। এই প্রক্রিয়া, ফ্লাশ, নিম্নলিখিত পয়েন্টগুলিতে ডিফল্টরূপে ঘটে

  • Find()বা এর কিছু আমন্ত্রণ থেকেEnumerable()
  • থেকে NHibernate.ITransaction.Commit()
  • থেকে ISession.Flush()

এসকিউএল বিবৃতি নিম্নলিখিত ক্রমে জারি করা হয়

  1. সমস্ত সত্তা সন্নিবেশ, একই ক্রমে সংশ্লিষ্ট বস্তুগুলি ব্যবহার করে সংরক্ষণ করা হয়েছিল ISession.Save()
  2. সমস্ত সত্তা আপডেট
  3. সমস্ত সংগ্রহ মুছে ফেলা
  4. সমস্ত সংগ্রহ উপাদান মুছে ফেলা, আপডেট এবং সন্নিবেশ
  5. সমস্ত সংগ্রহ সন্নিবেশ
  6. সমস্ত সত্তা মুছে ফেলা, একই ক্রমে সংশ্লিষ্ট বস্তুগুলি মুছে ফেলা হয়েছিল ISession.Delete()

(একটি ব্যতিক্রম হ'ল দেশীয় আইডি জেনারেশন ব্যবহার করা অবজেক্টগুলি সেভ করার পরে sertedোকানো হয়))

আপনি যখন স্পষ্ট করেন তখন ব্যতীত Flush()সেশন ADO.NET কলগুলি কার্যকর করে, সেগুলি কেবল কার্যকর হয় তার ক্রম সম্পর্কে কোনও গ্যারান্টি নেই । তবে এনএইচবারনেট গ্যারান্টি দেয় যে ISession.Find(..)পদ্ধতিগুলি কখনই বাসি ডেটা ফেরত দেবে না; না তারা ভুল তথ্য ফেরত দেবে না।

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

...

এছাড়াও পড়ুন এই বিভাগে :

একটি অধিবেশন শেষে চারটি স্বতন্ত্র পর্যায় জড়িত:

  • অধিবেশন ফ্লাশ
  • লেনদেন প্রতিশ্রুতিবদ্ধ
  • সেশন বন্ধ করুন
  • ব্যতিক্রমগুলি পরিচালনা করুন

অধিবেশন ফ্লাশিং

যদি আপনি ITransactionএপিআই ব্যবহার করে থাকেন তবে আপনার এই পদক্ষেপটি নিয়ে চিন্তা করার দরকার নেই। লেনদেন প্রতিশ্রুতিবদ্ধ হয় যখন এটি স্পষ্টভাবে সঞ্চালিত হবে। অন্যথায় আপনার ISession.Flush()পরিবর্তনগুলি ডাটাবেসের সাথে সিঙ্ক্রোনাইজ করা হয়েছে তা নিশ্চিত করার জন্য কল করা উচিত ।

ডাটাবেস লেনদেন প্রতিশ্রুতিবদ্ধ

আপনি যদি এনএইচবারনেট আইটি ট্রান্সজিশন এপিআই ব্যবহার করে থাকেন তবে এরকম দেখাচ্ছে:

tx.Commit(); // flush the session and commit the transaction

আপনি যদি নিজে ADO.NET লেনদেন পরিচালনা করে থাকেন তবে আপনাকে নিজে Commit()ADO.NET লেনদেন করা উচিত ।

sess.Flush();
currentTransaction.Commit();

যদি আপনি নিজের পরিবর্তনগুলি না করার সিদ্ধান্ত নেন:

tx.Rollback();  // rollback the transaction

বা:

currentTransaction.Rollback();

যদি আপনি লেনদেনটি রোলব্যাক করেন তবে আপনার অবিলম্বে বর্তমান সেশনটি বন্ধ করে দেওয়া উচিত এবং এনএইচবার্নেটের অভ্যন্তরীণ স্থিতিশীলতা স্থিতিশীল রয়েছে তা নিশ্চিত করতে হবে session

আইশনের সমাপ্তি

ISession.Close()একটি অধিবেশন শেষে চিহ্নিত করার জন্য একটি কল । ক্লোজ () এর মূল নিদর্শনটি হ'ল ADO.NET সংযোগটি অধিবেশন দ্বারা ত্যাগ করা হবে।

tx.Commit();
sess.Close();

sess.Flush();
currentTransaction.Commit();
sess.Close();

যদি আপনি নিজের সংযোগ সরবরাহ করেন তবে Close()এটিতে একটি রেফারেন্স দেয়, যাতে আপনি নিজে এটি বন্ধ করতে পারেন বা এটি পুলটিতে ফিরিয়ে দিতে পারেন। অন্যথায় Close()এটি পুলে ফেরত দেয়।


2
আমার জন্য, এই লাইনটি মূল ছিল: "ক্লোজ () এর মূল ইঙ্গিতটি হ'ল ADO.NET সংযোগটি অধিবেশন দ্বারা ত্যাগ করা হবে" " যদি আপনি আইসেশন.ক্লোজ () বন্ধ না করেন, আপনি ডিবি টাইমআউট না পাওয়া পর্যন্ত আপনার সংযোগগুলি পূর্ণ হয়ে যাবে। : ও
ডেভ থেইবেন

আমরা সাধারণত: সেশন ওপেন সেশন.বিগানট্র্যাশন () ওয়ার্ক ... সেশন.ট্রান্সসিটি.কমিট () সেশন.ব্যাগিনট্রান্সজেকশন () ওয়ার্ক ... সেশন.ট্রান্সেকশন.কমিট () সেশন.বেগিনট্রান্সঅ্যাকশন () ওয়ার্ক .. সেশন.ট্রান্সেকশন.কমিত () সেশন নিষ্পত্তি।
চটজলদি জেদী

উজ্জ্বল লিখন-আপ এবং +1 এবং ইত্যাদি - তবে আমি মনে করি একটি সম্পাদনা প্রয়োজন হতে পারে কারণ আপনি শীর্ষে বলছেন "কখনই বন্ধ ব্যবহার করবেন না" এবং তারপরে "যদি আপনি লেনদেনটি রোলব্যাক করেন তবে আপনাকে অবিলম্বে বর্তমান সেশনটি বন্ধ করে দেওয়া উচিত"
স্পেসবিসন

এসকিউএল স্টেটমেন্টের ক্রম পরিবর্তন করা যেতে পারে। আমি বলতে চাইছি কোনও সত্তা অবজেক্টের উপরে এবং সন্নিবেশ করার চেয়ে আমার আপডেট করা প্রয়োজন কারণ সংশ্লিষ্ট সারণীতে আমার একটি সীমাবদ্ধতা রয়েছে।
bob_saginowski

14

NHibernate 2.0 থেকে শুরু করে, ডিবি ক্রিয়াকলাপের জন্য লেনদেনের প্রয়োজন required অতএব, ITransaction.Commit()কল কোনও প্রয়োজনীয় ফ্লাশিং পরিচালনা করবে। যদি কোনও কারণে আপনি এনএইচবারনেট লেনদেন ব্যবহার না করে থাকেন তবে সেশনের কোনও স্বয়ংক্রিয়ভাবে ফ্লাশিং হবে না।


1

সময়ে সময়ে আইডিশনটি ADO.NET সংযোগের স্থিতিকে স্মৃতিতে ধারণ করে থাকা রাজ্যের সাথে সিঙ্ক্রোনাইজ করার জন্য প্রয়োজনীয় এসকিউএল স্টেটমেন্টগুলি সম্পাদন করে।

এবং সর্বদা ব্যবহার

 using (var transaction = session.BeginTransaction())
 {
     transaction.Commit();
 }

এই পরিবর্তনগুলির চেয়ে পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ হওয়ার পরে ডাটাবেজে সংরক্ষণ করতে আমরা লেনদেন করি Com কমিট ();


0

এখানে আমার কোডের দুটি উদাহরণ রয়েছে যেখানে এটি অধিবেশন ব্যতীত ব্যর্থ হবে l ফ্লাশ ():

http://www.lucidcoding.blogspot.co.uk/2012/05/changing-type-of-entity-persistence.html

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

ফ্লাশ () এর ব্যবহার আমাকে যা ঘটছে তার উপর আরও নিয়ন্ত্রণ দিয়েছে।

এখানে আরও একটি উদাহরণ:

ট্রানজেকশনস্কোপের অভ্যন্তরে এন সার্ভিসবাস বার্তা প্রেরণ

কেন এটি পুরোপুরি বুঝতে পারছি না তবে ফ্লাশ () আমার ত্রুটিটি ঘটতে বাধা দিয়েছে।

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