2012-05-16 30 views
5

Chúng tôi có dịch vụ WCF được lưu trữ trong IIS, chạy trên máy chủ. Dịch vụ kết nối với một cá thể SQL Server đang chạy trên một máy chủ khác. Trong mã của chúng tôi, chúng tôi mở và đóng kết nối cho từng yêu cầu. Dịch vụ WCF thực hiện một số yêu cầu mỗi phút cho cơ sở dữ liệu.Điều gì có thể khiến SqlClient tái sử dụng các kết nối không hợp lệ?

Nếu tôi khởi động lại dịch vụ SQL mà không dừng dịch vụ WCF, dịch vụ WCF bắt đầu ghi nhật ký lỗi vào nhật ký lỗi của chúng tôi, điều này hoàn toàn bình thường.

Vấn đề là đôi khi (không phải luôn luôn), sau khi dịch vụ SQL đã khởi động lại, các dịch vụ WCF tiếp tục báo cáo lỗi này trên tất cả các yêu cầu:

Cannot open database "mydatabase" requested by the login. The login failed." 

Các stack trace của lỗi kết thúc với:

at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) 
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
at System.Data.SqlClient.SqlConnection.Open() 

Trong khi điều này xảy ra, tôi có thể kết nối với cơ sở dữ liệu bằng SQL Management Studio (từ cùng một máy đang chạy dịch vụ WCF). Để khắc phục sự cố, tôi phải tái chế nhóm ứng dụng cho dịch vụ WCF của mình.

Vì vậy, câu hỏi của tôi là: Điều gì có thể gây ra điều này và tôi có thể làm gì để đảm bảo ứng dụng của tôi có thể khôi phục từ khi khởi động lại SQL?

P.S .: Trên hộp dev của tôi (cũng chạy IIS), khi tôi làm thử nghiệm tương tự, tôi nhận được lỗi tương tự một vài lần (trong khi cơ sở dữ liệu được bắt đầu tải).

+0

Bạn có thể muốn cố gắng nắm bắt SqlException và kiểm tra mã lỗi cụ thể sau đó gọi SqlConnection.ClearPool (sqlConnection); sau đó thử lại câu lệnh một lần nữa – Termit

Trả lời

1

Đôi khi kết nối bạn nhận được từ hồ bơi là kết nối mới (và nỗ lực kết nối của bạn thành công), lần khác kết nối được sử dụng lại và nỗ lực kết nối không thành công. Không phải tất cả các kết nối bị ngắt kết nối thực sự đều được sử dụng lại, bởi vì người chia bài có thể hoặc không thể phát hiện tình trạng và loại bỏ kết nối đó khỏi nhóm.

From here:

Nếu một kết nối tồn tại đến một máy chủ đã biến mất, nó có thể cho kết nối này được rút ra từ hồ bơi ngay cả khi pooler kết nối đã không được phát hiện kết nối bị cắt đứt và đánh dấu nó như là không hợp lệ. Khi điều này xảy ra, một ngoại lệ được tạo ra. Tuy nhiên, bạn vẫn phải đóng kết nối để phát hành lại vào hồ bơi.

Nếu bạn tạo kết nối rất hiếm khi, do đó không có ý nghĩa về hiệu suất, cách tốt nhất là tắt tính năng tổng hợp. Chỉ cần đặt Pooling thành no trong chuỗi kết nối.

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