আমি এখানে লিগ্যাসি কোড নিয়ে কাজ করছি এবং এর অনেকগুলি উদাহরণ রয়েছে SqlDataReaderযা কখনই বন্ধ বা নিষ্পত্তি হয় না। সংযোগটি বন্ধ রয়েছে তবে, পাঠককে ম্যানুয়ালি পরিচালনা করা প্রয়োজন কিনা তা আমি নিশ্চিত নই।
এটি কি পারফরম্যান্সে মন্দার কারণ হতে পারে?
উত্তর:
পাঠকদের এভাবে ব্যবহার না করার চেষ্টা করুন:
SqlConnection connection = new SqlConnection("connection string");
SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection);
SqlDataReader reader = cmd.ExecuteReader();
connection.Open();
if (reader != null)
{
while (reader.Read())
{
//do something
}
}
reader.Close(); // <- too easy to forget
reader.Dispose(); // <- too easy to forget
connection.Close(); // <- too easy to forget
পরিবর্তে, তাদের বিবৃতি ব্যবহার করে মোড়ানো:
using(SqlConnection connection = new SqlConnection("connection string"))
{
connection.Open();
using(SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection))
{
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader != null)
{
while (reader.Read())
{
//do something
}
}
} // reader closed and disposed up here
} // command disposed here
} //connection closed and disposed here
ব্যবহারের বিবৃতিটি অবজেক্টের সঠিক নিষ্পত্তি এবং সংস্থানগুলি মুক্ত করার বিষয়টি নিশ্চিত করবে।
যদি আপনি ভুলে যান তবে আপনি পরিষ্কার-পরিচ্ছন্নতা আবর্জনা সংগ্রহকারীকে ছেড়ে দিচ্ছেন, এতে কিছুটা সময় লাগতে পারে।
নোট করুন যে স্কেলকম্যান্ড ব্যবহার করে ইনস্ট্যান্টিয়েটেড স্কেলডাটাআরডারকে ডিসপোজ করা হয়েছে x এক্সিকিউটআরডার () অন্তর্নিহিত সংযোগটি বন্ধ / নিষ্পত্তি করবে না ।
দুটি সাধারণ নিদর্শন রয়েছে। প্রথমটিতে, পাঠক সংযোগের ক্ষেত্রের মধ্যে খোলা এবং বন্ধ করা হয়:
using(SqlConnection connection = ...)
{
connection.Open();
...
using(SqlCommand command = ...)
{
using(SqlDataReader reader = command.ExecuteReader())
{
... do your stuff ...
} // reader is closed/disposed here
} // command is closed/disposed here
} // connection is closed/disposed here
কখনও কখনও এটি ডেটা অ্যাক্সেসের পদ্ধতিটি কোনও সংযোগ খোলার এবং পাঠককে ফিরিয়ে দেওয়া সুবিধাজনক। এক্ষেত্রে এটি গুরুত্বপূর্ণ যে প্রত্যাবর্তিত পাঠকটি কমান্ডবিহেভিয়ার.ক্লোস কানেকশন ব্যবহার করে খোলা হবে, যাতে পাঠককে বন্ধ / ডিসপোজ করা অন্তর্নিহিত সংযোগটি বন্ধ করে দেয়। প্যাটার্নটি দেখতে এমন কিছু দেখাচ্ছে:
public SqlDataReader ExecuteReader(string commandText)
{
SqlConnection connection = new SqlConnection(...);
try
{
connection.Open();
using(SqlCommand command = new SqlCommand(commandText, connection))
{
return command.ExecuteReader(CommandBehavior.CloseConnection);
}
}
catch
{
// Close connection before rethrowing
connection.Close();
throw;
}
}
এবং কলিং কোডটি কেবল পাঠককে এইভাবে নিষ্পত্তি করতে হবে:
using(SqlDataReader reader = ExecuteReader(...))
{
... do your stuff ...
} // reader and connection are closed here.
usingতবে finally {}ধরা পড়ার পরে ব্লকটিতে কল নিষ্পত্তি করুন । এটি যেভাবে লেখা হয়েছে, সফল আদেশগুলি কখনই বন্ধ বা নিষ্পত্তি হবে না।
নিরাপদ থাকতে, প্রতিটি স্কেলডাটাআরডার বস্তুকে একটি ব্যবহারের বিবৃতিতে মোড়ানো করুন ।