সত্তা ফ্রেমওয়ার্ক এবং সংযোগ পুলিং


268

আমি সম্প্রতি আমার .NET 4.0 অ্যাপ্লিকেশনটিতে সত্তা ফ্রেমওয়ার্ক 4.0 ব্যবহার শুরু করেছি এবং পুলিং সম্পর্কিত কয়েকটি বিষয় সম্পর্কে আগ্রহী।

  1. আমি জানি হিসাবে সংযোগ পুলিং ADO.NET ডেটা সরবরাহকারী দ্বারা পরিচালিত হয়, আমার ক্ষেত্রে এমএস এসকিউএল সার্ভারের ক্ষেত্রে। আপনি যখন কোনও নতুন সত্তা প্রসঙ্গ ( ObjectContext) অর্থাত্ প্যারামিটারলেস ইনস্ট্যান্ট করবেন তখন এটি কি প্রয়োগ হয় new MyDatabaseModelEntities()?

  2. ক) সুবিধা এবং অসুবিধাগুলি ক) অ্যাপ্লিকেশনটির জন্য একটি বৈশ্বিক সত্তা প্রসঙ্গ তৈরি করা (যেমন একটি স্থির উদাহরণ) বা খ) প্রতিটি প্রদত্ত ক্রিয়াকলাপ / পদ্ধতির জন্য একটি usingব্লক সহ একটি সত্তা প্রসঙ্গ তৈরি ও প্রকাশ করা ।

  3. আমার সম্পর্কে জানা উচিত এমন কিছু দৃশ্যের জন্য অন্য কোনও প্রস্তাবনা, সেরা অনুশীলন, বা সাধারণ পদ্ধতি?

উত্তর:


369
  1. সংযোগ পুলিং অন্যান্য ADO.NET অ্যাপ্লিকেশন হিসাবে পরিচালনা করা হয়। সত্তা সংযোগ এখনও traditionalতিহ্যগত সংযোগ স্ট্রিং সঙ্গে traditionalতিহ্যগত ডাটাবেস সংযোগ ব্যবহার করে। আমি বিশ্বাস করি আপনি যদি এটি ব্যবহার করতে না চান তবে আপনি সংযোগ স্ট্রিংয়ে সংযোগ পুলিংটি বন্ধ করতে পারেন। ( এসকিউএল সার্ভার সংযোগ পুলিং (ADO.NET) সম্পর্কে আরও পড়ুন )
  2. কখনও বৈশ্বিক প্রসঙ্গ ব্যবহার করবেন না। অবজেক্টকন্টেক্সট আইডেন্টিটি ম্যাপ এবং ওয়ার্কের ইউনিট সহ অভ্যন্তরীণভাবে বেশ কয়েকটি নিদর্শনগুলি প্রয়োগ করে। বিশ্বব্যাপী প্রসঙ্গ ব্যবহারের প্রভাব প্রতি প্রয়োগের ক্ষেত্রে আলাদা।
  3. ওয়েব অ্যাপ্লিকেশনগুলির জন্য অনুরোধ অনুযায়ী একক প্রসঙ্গ ব্যবহার করুন। ওয়েব পরিষেবাদির জন্য কল প্রতি একক প্রসঙ্গ ব্যবহার করুন। উইনফোর্মে বা ডাব্লুপিএফ অ্যাপ্লিকেশনটিতে ফর্ম প্রতি বা উপস্থাপক হিসাবে একক প্রসঙ্গ ব্যবহার করুন। কিছু বিশেষ প্রয়োজনীয়তা থাকতে পারে যা এই পদ্ধতির ব্যবহার করতে দেয় না তবে বেশিরভাগ পরিস্থিতিতে এটি যথেষ্ট।

যদি আপনি জানতে চান যে ডাব্লুপিএফ / উইনফর্ম অ্যাপ্লিকেশনটির একক অবজেক্টের প্রসঙ্গটি কীভাবে প্রভাবিত হয় তবে এই নিবন্ধটি পরীক্ষা করুন । এটি এনহাইবারনেট সেশন সম্পর্কে তবে ধারণাটি একই is

সম্পাদনা:

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

আপনি SaveChangesপ্রসঙ্গে কথা না বলা অবধি সত্তাটিতে করা কোনও পরিবর্তন স্থির থাকে না । আপনি একাধিক সত্তায় পরিবর্তন করতে এবং সেগুলি একবারে সঞ্চয় করতে পারেন। একে ইউনিট অফ ওয়ার্ক প্যাটার্ন বলা হয় । আপনি কোন সংশোধিত সংযুক্ত সত্তাটি সংরক্ষণ করতে চান তা নির্বাচন করে বলতে পারবেন না।

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

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

এমনকি কেবলমাত্র পঠনযোগ্য অ্যাপ্লিকেশনের জন্যও বিশ্বব্যাপী প্রসঙ্গটি ভাল পছন্দ নয় কারণ আপনি যতবারই অ্যাপ্লিকেশনটি অনুসন্ধান করবেন আপনি সম্ভবত তাজা তথ্য চান।


আপনার উত্তর দেওয়ার জন্য ধন্যবাদ. সম্ভবত আপনি ব্যাখ্যা করতে পারেন কেন একক বিশ্বব্যাপী প্রসঙ্গ ব্যবহার করা খারাপ? এটি নিশ্চিতভাবে সমান্তরাল অ্যাক্সেসকে শক্ত করে তোলে, তবে আর কী ...?
নলডোরিন

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

আমি আপনার পরামর্শ গ্রহণ এবং singelton অপসারণ। এখন আমি আরও একটি ত্রুটি পেয়েছি: stackoverflow.com/questions/14795899/…
এলাদ বেনদা

আমি বুঝতে পারি যে কাজের প্যাটার্নের ইউনিট বাস্তবায়ন করা এবং DbContext এর encapsulating এর ব্যবসায়ের যুক্তি এবং ডাটাবেস ক্রিয়াকলাপ পৃথক করা উচিত। আমি কীভাবে কাজের প্যাটার্নের ইউনিট বাস্তবায়ন করতে পারি এবং কেবল কিছু ক্রিয়াকলাপের জন্য লেনদেনস্কোপ ব্যবহার করতে পারি তা আমি বুঝতে সক্ষম নই।
রুডল্ফ ডিভোরাসেক

4
@ রুডল্ডডোভরেসেক: সহজেই। TransactionScopeকাজের ইউনিটের সাথে সম্পর্কিত নয়, এটি আপনার ব্যবসায়ের যুক্তির সাথে সম্পর্কিত কারণ যুক্তি নিজেই লেনদেনকে সংজ্ঞায়িত করে। কাজের ইউনিট কেবলমাত্র একসাথে কী স্থির থাকতে হবে তা সংজ্ঞায়িত করে যেখানে লেনদেনের সুযোগ আপনাকে একই লেনদেনের মধ্যে একাধিকবার কাজের দৃistence়তার একক ব্যবহার করার অনুমতি দেয়।
লাদিস্লাভ Mrnka

70

ড্যানিয়েল সিমন্স অনুসারে:

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

এটি তাঁর বিস্তৃত নিবন্ধ থেকে এখানে:

http://msdn.microsoft.com/en-us/magazine/ee335715.aspx

আমি বিশ্বাস করি এই পরামর্শটি এইচটিটিপি অনুরোধগুলিতে প্রসারিত, সুতরাং এটিএসপিএনট এর জন্য বৈধ হবে। একটি রাষ্ট্রীয়, চর্বিযুক্ত ক্লায়েন্ট অ্যাপ্লিকেশন যেমন একটি ডাব্লুপিএফ অ্যাপ্লিকেশন "ভাগ করা" প্রসঙ্গের জন্য একমাত্র কেস হতে পারে।


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

ডাব্লুপিএফ অ্যাপ্লিকেশনটিতে কোনও বৈশ্বিক প্রেক্ষাপটে কোনও সুবিধা হবে না, তবে সম্ভবত এর কোনও উল্লেখযোগ্য ক্ষতি হবে না। আপনি যদি কোনও বৈশ্বিক প্রেক্ষাপট বাস্তবায়ন করেন, আপনাকে উচ্চ অনুরোধের হারের ক্ষেত্রে ডেটাবেস সংযোগগুলি (সংযোগের স্পষ্টভাবে সমাপন) ম্যানুয়াল পরিচালনা করতে হবে।
ডেভ সোয়ারস্কি

1
রাইট; তাই মূলত আমি একাধিক অস্থায়ী প্রসঙ্গ ব্যবহার করে সত্যই ভুল হতে পারি না (প্রদত্ত যে আমি জানতে পারি সংযোগ পুলিং হচ্ছে)? ... আপনি যদি একটি একক বিশ্বব্যাপী প্রসঙ্গ ব্যবহার করে থাকেন তবে তত্ত্বের সংযোগটি কি কোনও সময় এলোমেলো পয়েন্টে নেমে যেতে পারে না?
নলডোরিন

1
@ নোলোড্রিন: আমি মনে করি না যে সংযোগটি "এলোমেলোভাবে" নামবে ... ঝুঁকি হ'ল সংযোগগুলি খুব দীর্ঘ খোলা রাখা হতে পারে এবং সংযোগ পুলটি পরিপূর্ণ করতে পারে।
ডেভ সোয়ারস্কি

1
অবজেক্টকন্টেক্সট / ডিবি কনটেক্সট বাস্তবায়ন IDisposable, সুতরাং সবচেয়ে কম যুক্তিসঙ্গত সময়ের জন্য উন্মুক্ত হওয়া উচিত, আমার দৃষ্টিভঙ্গি।
নিকোডেমাস 13

12

EF6 (4,5 এছাড়াও) ডকুমেন্টেশন অনুসারে: https://msdn.microsoft.com/en-us/data/hh949853#9

9.3 অনুরোধ প্রসঙ্গে

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


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

1

কোডের নীচে আমার অবজেক্টকে তাজা ডাটাবেস মানগুলি সতেজ করতে সহায়তা করেছে। এন্ট্রি (অবজেক্ট)। রিলয়েড () কমান্ড বস্তুটিকে ডাটাবেস মানগুলি পুনরুদ্ধার করতে বাধ্য করে

GM_MEMBERS member = DatabaseObjectContext.GM_MEMBERS.FirstOrDefault(p => p.Username == username && p.ApplicationName == this.ApplicationName);
DatabaseObjectContext.Entry(member).Reload();

পাশাপাশি এটি সংগ্রহের জন্য (ভিবি কোড):CType(myContext, IObjectContextAdapter).ObjectContext.Refresh(RefreshMode.StoreWins,myCustomers)
ইভান ফেরার ভিলা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.