বেশিরভাগ ক্ষেত্রে সংযোগ পুলিংয়ের সমস্যা "সংযোগ ফাঁস" এর সাথে সম্পর্কিত। আপনার অ্যাপ্লিকেশন সম্ভবত এটির ডাটাবেস সংযোগগুলি সঠিক এবং ধারাবাহিকভাবে বন্ধ করে না। আপনি যখন সংযোগগুলি খোলা রাখেন, ততক্ষণ পর্যন্ত তারা নেট Finalize()
পদ্ধতিতে কল করে N নেট আবর্জনা সংগ্রহকারী আপনার জন্য বন্ধ না করে ।
আপনি নিশ্চিত করতে চান যে আপনি সত্যই সংযোগটি বন্ধ করছেন । উদাহরণস্বরূপ নিম্নলিখিত কোড একটি সংযোগ লিক কারণ হবে, যদি মধ্যবর্তী কোড .Open
এবং Close
একটি ব্যতিক্রম ছোঁড়ার:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
সঠিক উপায়টি হ'ল:
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
অথবা
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
যখন আপনার ফাংশন কোনও শ্রেণি পদ্ধতি থেকে কোনও সংযোগ ফেরত দেয় তা নিশ্চিত করে নিন যে আপনি এটি স্থানীয়ভাবে ক্যাশে রেখেছেন এবং তার Close
পদ্ধতিটি কল করেছেন । আপনি এই কোডটি ব্যবহার করে একটি সংযোগ ফাঁস করবেন উদাহরণস্বরূপ:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
প্রথম কল থেকে ফিরে আসা সংযোগটি getConnection()
বন্ধ হচ্ছে না। আপনার সংযোগটি বন্ধ করার পরিবর্তে, এই লাইনটি একটি নতুন তৈরি করে এবং এটি বন্ধ করার চেষ্টা করে।
আপনি যদি ব্যবহার করেন SqlDataReader
বা ক OleDbDataReader
, এগুলি বন্ধ করুন। যদিও সংযোগটি বন্ধ করা নিজেই কৌতূহল অনুভব করে, আপনার ডেটা রিডার অবজেক্টগুলি স্পষ্টভাবে বন্ধ করার জন্য অতিরিক্ত প্রচেষ্টা করুন যখন আপনি সেগুলি ব্যবহার করেন।
এমএসডিএন / এসকিউএল ম্যাগাজিনের " কেন একটি সংযোগ পুল ওভারফ্লো হয়? " এই নিবন্ধটি অনেক বিবরণ ব্যাখ্যা করে এবং কিছু ডিবাগ করার কৌশল প্রস্তাব করে:
- চালান
sp_who
বা sp_who2
। এই সিস্টেম সঞ্চিত পদ্ধতিগুলি sysprocesses
সিস্টেম সারণী থেকে তথ্যগুলি ফেরত দেয় যা সমস্ত কার্য প্রক্রিয়া সম্পর্কিত স্থিতি এবং তথ্য দেখায়। সাধারণত, আপনি প্রতি সংযোগে একটি সার্ভার প্রক্রিয়া আইডি (এসপিআইডি) দেখতে পাবেন। আপনি যদি সংযোগ স্ট্রিংয়ে অ্যাপ্লিকেশন নামের যুক্তি ব্যবহার করে আপনার সংযোগটির নাম দিয়েছেন তবে আপনার কাজের সংযোগগুলি খুঁজে পাওয়া সহজ হবে।
TSQL_Replay
খোলা সংযোগগুলি সনাক্ত করতে এসকিউএলপ্রফিলার টেম্পলেট সহ এসকিউএল সার্ভার প্রোফাইলার ব্যবহার করুন । আপনি যদি প্রোফাইলারের সাথে পরিচিত হন তবে এই পদ্ধতিটি স্প_ও ব্যবহার করে ভোট দেওয়ার চেয়ে সহজ।
- পুল এবং সংযোগগুলি পর্যবেক্ষণ করতে পারফরম্যান্স মনিটর ব্যবহার করুন। আমি এই পদ্ধতিটি মুহুর্তে আলোচনা করি।
- কোডে পারফরম্যান্স কাউন্টারগুলি পর্যবেক্ষণ করুন। কাউন্টারগুলি বের করার জন্য রুটিনগুলি ব্যবহার করে বা নতুন .NET পারফরম্যান্স কাউন্টার নিয়ন্ত্রণ ব্যবহার করে আপনি আপনার সংযোগ পুলের স্বাস্থ্য এবং প্রতিষ্ঠিত সংযোগগুলির সংখ্যা পর্যবেক্ষণ করতে পারেন।