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).
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