2008-11-24 27 views
5

Tôi đang sử dụng Transaction Binding=Explicit Unbind trong chuỗi kết nối như được đề xuất here vì tôi cũng đang sử dụng TransactionScope với thời gian chờ. Vấn đề là các kết nối dường như không đóng sau khi được xử lý và cuối cùng không có kết nối nào có sẵn trong nhóm kết nối. Tôi đã nhận được kết quả tương tự khi tôi sửa đổi TransactionTimeoutIssueDemo (xem liên kết) và chạy TransactionScopeTest() (với chuỗi kết nối unbind rõ ràng) đủ thời gian trong một vòng lặp để sử dụng hết tất cả các kết nối có sẵn trong nhóm kết nối. Giá trị mặc định cho các kết nối trong nhóm là 100 nhưng điều này có thể được thay đổi bằng cách sử dụng thiết lập Max Pool Size =10 chẳng hạn. Dường như các kết nối sẽ không được giải phóng khi sử dụng unbind rõ ràng mặc dù cả SqlConnection và TransactionScope được sử dụng với mệnh đề using. Bất cứ ai biết làm thế nào để xử lý này?Kết nối sẽ không đóng khi sử dụng Giao dịch ràng buộc = Không rõ ràng; trong chuỗi kết nối

Trả lời

3

Các kết nối chỉ dường như ở lại trong hồ bơi và không được sử dụng lại trong trường hợp bạn nhận được ngoại lệ, giống như ví dụ. Nếu bạn tăng thời gian chờ, kết nối sẽ được sử dụng lại.

Một cách giải quyết cho vấn đề này là để xóa các hồ bơi kết nối trong trường hợp bạn có được một ngoại lệ như thế này:

using (SqlConnection con = new SqlConnection(connectionString)) 
{ 
    con.Open(); 
    try 
    { 
     Console.WriteLine("Server is {0}", con.ServerVersion); 
     Console.WriteLine("Clr is {0}", Environment.Version); 
     for (int i = 0; i < 5; i++) 
     { 
      using (SqlCommand cmd = con.CreateCommand()) 
      { 
       cmd.CommandText = "insert into TXTEST values (" + i + ")"; 
       cmd.ExecuteNonQuery(); 
      } 
      Console.WriteLine("Row inserted"); 
     } 
     Thread.Sleep(TimeSpan.FromSeconds(1)); 
    } 
    catch 
    { 
     SqlConnection.ClearPool(con); 
     throw; 
    } 
} 

Trong hầu hết các trường hợp, các giao dịch sẽ hoàn thành trong thời gian chờ và mọi thứ sẽ ổn thôi và dandy. Khi giao dịch thực sự làm thời gian chờ bạn xóa hồ bơi để làm sạch các kết nối bẩn sẽ không được sử dụng lại. Điều này tất nhiên sẽ ảnh hưởng đến các kết nối khác trong hồ bơi mà không bị ảnh hưởng bởi vấn đề này.

Đây là giải pháp xấu nhưng có vẻ như hoạt động.

0

Đối với những gì đáng giá, sự cố này đã được khắc phục trong .Net 4.0.

Các vấn đề liên quan