2009-07-20 42 views
14

Tôi đã có một số trang web ASP.Net (.Net v3.5) chạy trên máy chủ có cơ sở dữ liệu SQL 2000 phụ trợ. Trong vài tháng, tôi đã nhận được InvalidOperationExceptions dường như ngẫu nhiên với thông báo "Lỗi kết nối nội bộ". Đôi khi có một vài ngày ở giữa, trong khi các thời điểm khác có nhiều lỗi mỗi ngày.Nguyên nhân "Lỗi kết nối nội bộ"

Ngoại lệ không giới hạn ở một trang web cụ thể, mặc dù chúng chia sẻ các hội đồng truy cập dữ liệu và kinh doanh. Lỗi này dường như luôn được ném từ SqlClient.TdsParser.Run(). Đôi khi nó được ném từ các cuộc gọi SqlCommand.Execute() trực tiếp của trường học cũ, trong khi các lần khác nó được ném từ mã LINQ2Sql.

Tôi đã được đảm bảo bởi các chàng trai mạng rằng không có lỗi hoặc gói bị mất vào cuối của họ. Đã có ai thử điều này chưa? Nó có thể là một vấn đề trình điều khiển? Chúng tôi chưa thể xác định được trình kích hoạt cụ thể cho ngoại lệ này.

Chúng tôi đang chạy II6 trên Windows Server 2003.

Trả lời

21

Sau một vài tháng bỏ qua vấn đề này, nó bắt đầu đạt đến khối lượng tới hạn khi lưu lượng truy cập tăng dần. Dưới tải trọng nặng, bao gồm một số trình thu thập dữ liệu, mọi thứ trở nên điên rồ và các lỗi này đổ vào không ngừng nghỉ.

Thông qua thử và sai, chúng tôi cuối cùng đã theo dõi một số truy vấn SqlCommand hoặc LINQ mà SqlConnection không bị đóng ngay sau khi sử dụng. Thay vào đó, thông qua một số chương trình cẩu thả bắt nguồn từ một sự hiểu lầm về các kết nối LINQ, các đối tượng DataContext đã được xử lý (và các kết nối đóng) chỉ ở phần cuối của một yêu cầu thay vì ngay lập tức.

Khi chúng tôi đã tái cấu trúc các phương pháp này để đóng ngay lập tức kết nối với khối C# "đang sử dụng" (giải phóng hồ bơi đó cho yêu cầu tiếp theo), chúng tôi không nhận được thêm lỗi nào. Mặc dù chúng tôi vẫn không biết lý do cơ bản khiến hồ bơi kết nối bị lẫn lộn, chúng tôi có thể ngừng tất cả các lỗi thuộc loại này. Sự cố này đã được giải quyết cùng với một lỗi tương tự khác mà tôi đã đăng, được tìm thấy tại đây: Why is my SqlCommand returning a string when it should be an int?

1

Kiểm tra thư mục LOG của máy chủ của bạn (\ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ LOG hoặc tương tự) cho tập tin có tên SqlDump * .mdmp và SqlDump * .txt. Nếu bạn tìm thấy bất kỳ thứ gì, bạn sẽ phải mang nó đến Hỗ trợ sản phẩm.

1

Có vẻ như kết nối cơ sở dữ liệu bị giảm hoặc hết thời gian.

Gần đây, chúng tôi đã gặp sự cố tương tự khi chuyển sang IIS 6 từ IIS 5 kết nối với SQL 2000. Vấn đề của chúng tôi đã được giải quyết bằng cách tăng số lượng cổng tạm thời khả dụng.

Nhìn vào việc sử dụng các cổng tạm thời bởi máy chủ IIS. Số tối đa mặc định là không. của các cổng có sẵn là bình thường 4000. Bạn có thể muốn xem xét tăng điều này nếu các trang web trên máy chủ của bạn đặc biệt bận rộn hoặc ứng dụng của bạn đang thực hiện rất nhiều cuộc gọi cơ sở dữ liệu.

Bạn có thể theo dõi những điều này trước để xem liệu có vượt quá giới hạn tối đa hay không.

Tìm kiếm cơ sở Kiến thức Microsoft cho "MaxUserPort" và "TcpTimedWaitDelay" và thực hiện các thay đổi đăng ký cần thiết. Đảm bảo bạn sao lưu registry hoặc máy chủ ảnh chụp trước khi thực hiện các thay đổi. Sẽ cần khởi động lại để các thay đổi có hiệu lực.

Bạn nên kiểm tra kỹ cơ sở dữ liệu và kết nối recordset của bạn đang bị đóng sau khi sử dụng. Không đóng sẽ sử dụng phạm vi cổng này một cách không cần thiết.

Kiểm tra hiệu quả của các thủ tục được lưu trữ của bạn vì chúng có thể mất nhiều thời gian hơn mức cần thiết.

"Nếu bạn nhanh chóng mở và đóng 4000 ổ cắm trong vòng chưa đầy bốn phút, bạn sẽ đạt được cài đặt tối đa mặc định cho cổng ẩn danh của ứng dụng khách và nỗ lực kết nối ổ cắm mới không thành công cho đến khi bộ khóa TIME_WAIT hiện tại hết giờ." - từ http://support.microsoft.com/kb/328476

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