ডাটাবেস সংযোগ তৈরি করা - এটি একবার বা প্রতিটি প্রশ্নের জন্য?


101

আমার ওয়েব পৃষ্ঠাটি প্রথম লোড হওয়ার পরে এই মুহূর্তে আমি একটি ডাটাবেস সংযোগ তৈরি করি। আমি তখন পৃষ্ঠাটি প্রক্রিয়া করি এবং সেই সংযোগের বিরুদ্ধে কোনও প্রশ্ন চালাই। এটি করার জন্য এটি কি সেরা উপায় বা আমি যখনই কোনও জিজ্ঞাসা চালাব তখনই কি আমি একটি ডাটাবেস সংযোগ তৈরি করব?

PS এটি আমার কাছে ১ টি সংযোগ তৈরি করতে এবং এটি ব্যবহার করতে আরও বোঝাপড়া করে তবে আমি জানি না যে এটি অন্য কোনও সমস্যার কারণ হতে পারে কিনা।

আমি এমএসএসকিউএল সহ সি # (এএসপি.নেট) ব্যবহার করছি।

উত্তর:


124

আপনি যদি প্রতি প্রশ্নের / লেনদেনের জন্য একটি তৈরি করেন তবে সংযোগগুলি "বন্ধ" পরিচালনা করা অনেক সহজ।

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

আপনি যখন কোনও সংযোগের দরকার হলে এটি খোলেন এবং শেষ হয়ে গেলে তা নিষ্পত্তি করে ফেলেন, এটি আসলে সংযোগটি বন্ধ করবে না, এটি আবার ব্যবহার করার জন্য এটি সংযোগ পুলে ফিরিয়ে দেবে।


আপনি যখন এটি পোস্ট করেছিলেন সবেমাত্র সেই নিবন্ধটি পড়ছিলেন :) ধন্যবাদ।
ওয়েবনুব

2
আপনি যে ওয়েবপৃষ্ঠায় লিঙ্ক করেছেন সেটি এসকিউএল সার্ভারের সাথে নির্দিষ্ট। অন্যান্য ডাটাবেসের সাথে সংযোগ করার সময়। নেট কী স্বয়ংক্রিয় পুলিং সরবরাহ করে যেমন - ওরাকল, স্ক্লাইট, মাই এসকিএল?
ব্রিডুমস

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

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

1
এটা যে উদ্বোধনী পরিচিত উচিত একটি ক্যোয়ারী দৌড়োনো এবং একটি সংযোগ ত্যাগী, এমনকি একটি লুপ, সমানভাবে হিসাবে দ্রুত, এবং কখনও কখনও হয় দ্রুততর এটি একবার খোলার ক্যোয়ারী লুপিং করে। সর্বদা কেবল নিষ্পত্তি। এটি আরও সুরক্ষিত এবং দ্রুত। পুল থেকে সংযোগ পাওয়ার ওভারহেড সম্পর্কে চিন্তা করবেন না - এটি এত তুচ্ছ।
স্ম্রাডার

38

প্রতি প্রশ্নের জন্য একটি সংযোগ তৈরি করার জন্য এটি সেরা অনুশীলন করুন - এবং ডেটা প্রদর্শন করার ক্ষেত্রে, সর্বোত্তম অনুশীলনটি হল কোয়েরিতে সমস্ত প্রয়োজনীয় ডেটা একসাথে আনতে হবে

পেছনের তথ্য:

.NET- এ, কলিং SqlConnection.Open()ডিফল্টরূপে সর্বদা স্বচ্ছভাবে সংযোগ পুলিং ব্যবহার করবে ( এমএসডিএন-তে "এসকিউএল সার্ভারের সাথে সংযোগ পুলিং ব্যবহার করুন" দেখুন )। সুতরাং আপনি কেবল একটি নতুন সংযোগ ব্যবহার করে দখল করতে পারেন Open(), এবং Close()আপনার কাজ শেষ হয়ে গেলে কল করতে পারেন এবং। নেট সঠিক কাজ করবে।

নোট করুন যে সংযোগ পুলিং ছাড়াই, ক্যোয়ারী অনুসারে একটি সংযোগ করা খুব খারাপ ধারণা হবে কারণ আসল ডাটাবেস সংযোগগুলি তৈরি করা খুব ব্যয়বহুল (প্রমাণীকরণ, নেটওয়ার্ক ওভারহেড ইত্যাদি) হতে পারে এবং একসাথে মুক্ত সংযোগের সংখ্যা সাধারণত খুব সীমাবদ্ধ থাকে।


7
@ ওয়েবনুব - যেহেতু .NET সংযোগ পুলিং ব্যবহার করে, না, এটি করে না। কারণ সংযোগ বন্ধ, পুনরায় বরাদ্দ ইত্যাদি পেতে পারেন - তাই একটি সংযোগ পুনঃব্যবহার হয় না ভাল অভ্যাস।
ওদেড

11
-1 উত্তরটি বরং বিভ্রান্তিকর। প্রতি ক্যোয়ারী সংযোগ তৈরি করা খুব খারাপ ধারণা। আপনার সম্ভবত বোঝার অর্থ হ'ল "সংযোগ পুল থেকে প্রতিটি প্রশ্নের জন্য একটি নতুন সংযোগ পুনরুদ্ধার করুন" - তবে এটি সংযোগ তৈরির মতো নয় ।
স্লেস্কে

1
@ স্লেসকে - পিডিআরের উত্তর থেকে এটি কীভাবে আলাদা?
ওডে

3
@ ওবেদ: আহ, আমি দেখছি। । নেট, কলিং SqlConnection.Open()সর্বদা স্বচ্ছভাবে সংযোগ পুলিং ব্যবহার করবে। সুতরাং "সংযোগ খুলুন" এবং "পুল থেকে সংযোগ পুনরুদ্ধার করুন" এর মধ্যে পার্থক্য বিদ্যমান নেই। আমার ভুল বোঝাবুঝি আমি প্রশ্নটির সামান্য ব্যাখ্যা সম্পাদনা করার স্বাধীনতা নিয়েছি এবং ভোটটি ফিরিয়ে নিয়েছি।
সালশে

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

0

মনে রাখবেন এগুলি। নেট ইকোসিস্টেমের প্রসঙ্গে।

বিকাশকারীরা কখনও কখনও তাদের সংযোগের বিষয়গুলি পুনরায় ব্যবহার করতে তাদের কোডটি "অনুকূলিত করতে" চান। এই প্রশ্নের প্রসঙ্গে প্রদত্ত, এটি প্রায় সর্বদা একটি ভুল।

ADO.Net এর একটি সংযোগ পুলিং নামে একটি বৈশিষ্ট্য রয়েছে । আপনি যখন একটি নতুন সংযোগ অবজেক্ট তৈরি এবং খুলবেন তখন আপনি যা করছেন তা পুল থেকে সংযোগের জন্য অনুরোধ করছে। আপনি যখন কোনও সংযোগ বন্ধ করেন, আপনি এটি পুলটিতে ফিরিয়ে দিন।

এটা তোলে বস্তু আমরা কোডে সরাসরি ব্যবহার বুঝতে গুরুত্বপূর্ণ: SqlConnection, MySqlConnection, OleDbConnectio ইত্যাদি সবাই মাত্র চাদরে ADO.Net দ্বারা পরিচালিত একটি বাস্তব অন্তর্নিহিত সংযোগ প্রায়, এবং ADO.Net বাস্তব সংযোগ অনেক "গুরুতর" এবং আরো ব্যয়বহুল একটি পারফরম্যান্স দৃষ্টিকোণ থেকে। প্রমাণীকরণ, নেটওয়ার্ক ট্রানজিট, এনক্রিপশন ইত্যাদির মতো উদ্বেগগুলির মধ্যে এই অন্তর্নিহিত অবজেক্টগুলি হ'ল সেই জিনিসগুলি যা আপনি আসলে আপনার নিজের কোডে দেখেন সেই অবজেক্টটিতে স্বল্প পরিমাণের মেমরি ছাড়িয়ে যায়।

আপনি যখন নিজের সংযোগের অবজেক্টটি পুনরায় ব্যবহার করার চেষ্টা করবেন তখন আপনি গুরুত্বপূর্ণ অন্তর্নিহিত সংযোগগুলি কার্যকরভাবে পরিচালনা করার জন্য ADO.Net এর ক্ষমতাটি ভেঙে ফেলেন। আপনি আরও বড় জিনিস ব্যয়ে ছোট জিনিস দক্ষতা অর্জন।

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

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

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


তবে এটি কেবল এক ধরণের অপ্টিমাইজেশন। প্রোগ্রামার সময়টি অনুকূলকরণ এবং কার্যকর কোড পুনরায় ব্যবহার লাভ করারও রয়েছে। বিকাশকারীরা কেবল খোলা এবং ব্যবহারের জন্য প্রস্তুত যে সংযোগের অবজেক্ট পেতে বারবার একই বয়লারপ্লিট কোডটি লিখতে চান না। এটি কেবল ক্লান্তিকরই নয়, এটি প্রোগ্রামে বাগ প্রবর্তনের একটি উপায়।

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


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