ในกรณีส่วนใหญ่ปัญหาการรวมการเชื่อมต่อเกี่ยวข้องกับ "การรั่วไหลของการเชื่อมต่อ" แอปพลิเคชันของคุณอาจไม่ปิดการเชื่อมต่อฐานข้อมูลอย่างถูกต้องและสม่ำเสมอ เมื่อคุณเปิดการเชื่อมต่อไว้การเชื่อมต่อจะยังคงถูกบล็อกจนกว่าตัวรวบรวมขยะ. NET จะปิดการเชื่อมต่อให้กับคุณโดยการเรียกFinalize()
วิธีการของพวกเขา
คุณต้องการให้แน่ใจว่าคุณกำลังปิดการเชื่อมต่อจริง ๆ ตัวอย่างเช่นรหัสต่อไปนี้จะทำให้เกิดการรั่วไหลของการเชื่อมต่อหากรหัสระหว่าง.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
ปิดให้ปิด แม้ว่าการปิดการเชื่อมต่อนั้นจะเป็นการหลอกลวง แต่ก็พยายามปิดวัตถุเครื่องอ่านข้อมูลของคุณอย่างชัดเจนเมื่อคุณใช้งาน
บทความนี้ " ทำไม Connection Pool Overflow? " จากนิตยสาร MSDN / SQL อธิบายรายละเอียดจำนวนมากและแนะนำกลยุทธ์การดีบัก:
- เรียกใช้หรือ
sp_who
sp_who2
โพรซีเดอร์ที่เก็บระบบเหล่านี้ส่งคืนข้อมูลจากsysprocesses
ตารางระบบที่แสดงสถานะและข้อมูลเกี่ยวกับกระบวนการทำงานทั้งหมด โดยทั่วไปคุณจะเห็น ID กระบวนการของเซิร์ฟเวอร์ (SPID) ต่อการเชื่อมต่อ หากคุณตั้งชื่อการเชื่อมต่อของคุณโดยใช้อาร์กิวเมนต์ชื่อแอปพลิเคชันในสตริงการเชื่อมต่อการเชื่อมต่อที่ใช้งานได้จะหาได้ง่าย
- ใช้ SQL Server Profiler กับ
TSQL_Replay
เทมเพลตSQLProfiler เพื่อติดตามการเชื่อมต่อที่เปิดอยู่ หากคุณคุ้นเคยกับ Profiler วิธีนี้จะง่ายกว่าการใช้การลงคะแนนโดยใช้ sp_who
- ใช้การตรวจสอบประสิทธิภาพเพื่อตรวจสอบพูลและการเชื่อมต่อ ฉันหารือเกี่ยวกับวิธีนี้ในอีกสักครู่
- ตรวจสอบเคาน์เตอร์วัดประสิทธิภาพในรหัส คุณสามารถตรวจสอบสถานะของพูลการเชื่อมต่อของคุณและจำนวนการเชื่อมต่อที่สร้างขึ้นโดยใช้รูทีนเพื่อแยกตัวนับหรือโดยใช้ตัวควบคุม. NET PerformanceCounter ใหม่