Tôi hiểu rằng nếu tôi khởi tạo một đối tượng SqlConnection, tôi thực sự lấy một kết nối từ một nhóm kết nối. Khi tôi gọi Open(), nó sẽ mở kết nối. Nếu tôi gọi phương thức Close() hoặc Dispose() trên đối tượng SqlConnection đó, nó sẽ được trả về pool kết nối.Làm thế nào để buộc một SqlConnection để đóng cửa vật lý, trong khi sử dụng kết nối tổng hợp?
Tuy nhiên, điều đó không thực sự cho tôi biết nếu nó thực sự bị đóng hoặc nếu tôi vẫn có kết nối hoạt động với cơ sở dữ liệu.
Làm cách nào để buộc SqlConnection đóng ở cấp mạng, hoặc ít nhất là phải biết khi nào nó đóng?
Ví dụ:
using(SqlConnection conn = new SqlConnection(DBConnString)) {
conn.Open();
SqlCommand cmd = conn.CreateCommand();
...
cmd.ExecuteReader(CommandBehavior.CloseConnection);
...
}
- Đầu tiên chạy: 300 ms
- Second chạy: 100 ms
- thứ ba chạy: 100 ms
- Sau khi chờ đợi một thời gian dài (30 phút) : 300 ms
Nếu kết nối là TRULY kết thúc, lần chạy thứ hai và thứ ba cũng phải là 300 ms. Nhưng tôi biết rằng kết nối không thực sự bị đóng cho những lần chạy đó (tôi đã kiểm tra màn hình hoạt động của SQL Server). Nó không mất thêm 200ms để thực hiện xác thực/etc.
Làm cách nào để buộc kết nối thực sự đóng?
Ý tưởng
- Liệu CommandBehavior.CloseConnection làm việc? (dường như không?)
- Cài đặt "Kích thước hồ bơi tối đa = 0" trong chuỗi kết nối có hoạt động không? (đây sẽ là giải pháp pyrrhic)
- Dispose() có hoạt động không?
Tài liệu tham khảo
- Điều trên Connection Pooling
- Dưới đây là một số khác cho chúng ta biết rằng Close() doesn't really close kết nối.
- Một bài viết trên pros and cons connection pooling
+1 cho người trả lời đầu tiên để đọc câu hỏi đúng cách. – Joe
Tôi đang làm điều này, nhưng kết nối SQL của tôi vẫn hiển thị trong sp_who2 và khóa phiên giữ SQL của tôi vẫn bị khóa (tôi dự định chúng sẽ chết với kết nối). Tôi thậm chí còn đặt ['connStrBuilder.Polling = false'] (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close (v = vs.110) .aspx). –