2010-06-22 21 views
7

Chúng tôi đã gặp sự cố này một thời gian và tôi thực sự đang cố gắng che giấu những gì gây ra nó.Ứng dụng ASP cổ điển gặp phải SQL Server "Timeouts" và "SQL Server không tồn tại hoặc truy cập bị từ chối"

Một vài lần trong ngày, chúng tôi sẽ thấy các trang web bắt đầu ném "[Microsoft] [ODBC SQL Server Driver] Hết thời gian chờ", sau đó các trang bắt đầu ném "[Microsoft] [ODBC SQL Server Driver] [ DBNETLIB] SQL Server không tồn tại hoặc truy cập bị từ chối. "

Chúng tôi có nhiều ứng dụng khác nhau kết nối với máy chủ cơ sở dữ liệu này. Nó trung bình khoảng 2500 kết nối đồng thời xử lý trung bình 10.000 giao dịch mỗi giây. Hầu hết các ứng dụng của chúng tôi không có vấn đề gì, các vấn đề dường như chỉ xảy ra trên máy chủ web. (Có lẽ nó liên quan đến kết nối tổng hợp?)

Tôi không chắc chắn nên phân bổ vấn đề này. Các máy chủ SQL trong câu hỏi là bao la overpowered cho công việc mà nó làm, và được trang bị với mỗi bộ xử lý cấp giấy phép. Vì vậy, tôi không nghĩ rằng chúng tôi đang xem xét vấn đề cấp phép/hiệu suất.

Tôi nghĩ có thể có sự cố kết nối IP, vì vậy tôi đã thay đổi ConnectionString để sử dụng địa chỉ IP và chạy một số ping dài. Tôi nhận được 0 gói bị mất giữa máy chủ Web và máy chủ Cơ sở dữ liệu.

Các ASP chuỗi kết nối bây giờ trông như thế này:

Provider=MSDASQL; Driver={SQL Server}; Server=10.0.100.100; Database=DBName; UID=WebUserName; PWD=WebUserPassword; ConnectionTimeout=15; CommandTimeout=120; 

Người dùng là một người dùng không nằm trong miền kết nối sử dụng xác thực SQL Server. Vì vậy, tôi không nghĩ rằng đó là một vấn đề liên quan đến miền. Tôi đã kiểm tra các tệp nhật ký máy chủ SQL và không tìm thấy bất kỳ điều gì tương ứng với các sự cố.

Tôi đã tìm thấy another stackoverflow question mô tả hành vi tương tự, nhưng không có độ phân giải.

Các chi tiết:

  • Web Server: Windows 2003 Standard SP2, IIS 6.
  • Database Server: Microsoft SQL Server 9.0.4035

Có ai nhìn thấy/giải quyết này loại vấn đề? Có ai có bất cứ đề nghị như nơi tôi nên xem xét tiếp theo?

Cảm ơn!

-Zorlack

EDIT

bất cứ ai có thể cho tôi biết những gì các thực hành tốt nhất là để thực hiện các truy vấn sql trong asp-tải cao cổ điển? Chúng tôi có muốn thử tận dụng kết nối tổng hợp không?

Trong cách nhìn vào mã, khá nhiều trông như thế này:

Set objCn = Server.CreateObject("ADODB.Connection") 
objCn.Open(Application("RoConnStr")) 
'do some stuff 
objCn.Close 
Set objCn = Nothing 

Solution (theo lời khuyên của ScottE)

This article mô tả, với một tee, vấn đề của tôi. Tôi đã thực hiện thay đổi đăng ký và sau đó khởi động lại máy chủ.

Sự cố được giải quyết!

+0

Cảm ơn, tôi cũng gặp sự cố này. Có vẻ như kết nối tổng hợp là một cá trích đỏ mặc dù. Khi tôi thử nghiệm có và không có kết nối tổng hợp trên, máy chủ vẫn tạo ra hàng nghìn kết nối TCP trong trạng thái TIME_WAIT. Có vẻ như hồ bơi kết nối cho phép bạn sử dụng lại các đối tượng kết nối, nhưng đôi khi chúng tạo ra nhiều kết nối TCP mới giữa các máy chủ. –

Trả lời

7

Ứng dụng web của bạn có đang đóng và hủy bỏ (được đặt thành không có gì) của kết nối cơ sở dữ liệu không?

Ngoài ra, bạn đã thử sử dụng SQLOLEDB thay vì ODBC chưa? Không thể nghĩ ra bất kỳ lý do nào tại sao bạn sẽ sử dụng ODBC ở đây.

đây là chuỗi kết nối của tôi trên một ứng dụng asp cổ điển rất bận rộn:

Dim strcConn 
strConn = "Provider=SQLOLEDB; Data Source=someserver; Initial Catalog=somedb; User ID=someuserid; Password=somepassword" 

Sửa

Tôi đã xem qua gửi bài blog này. Loại thú vị.

http://www.ryanbutcher.com/2006/02/classic-asp-on-2003-server-with.html

+1

Đây là hai điều tôi sẽ xem xét: ODBC thêm trừu tượng không cần thiết cho kết nối và không đòi lại các kết nối là một vấn đề phổ biến. – Godeke

+0

Hầu hết thời gian ứng dụng không đặt đối tượng kết nối thành không có gì khi hoàn tất. Sự hiểu biết của tôi vào thời điểm đó là bằng cách rời khỏi đối tượng kết nối xung quanh là không sao vì nó sẽ nằm ngoài phạm vi khi trang đã hoàn tất hiển thị. Tại thời điểm đó không kết nối tổng hợp tiếp quản? – zorlack

+0

Xem chỉnh sửa ở trên – zorlack

0

Giờ tôi đã có vấn đề như vậy, luôn luôn phải để với một ai đó giữ dữ liệu mở trong một ứng dụng khách hàng mà không commiting một 'chọn ..' tuyên bố.

Không biết điều này có giải quyết được vấn đề của bạn ở đây không ... tuy nhiên.

2

Tôi đã giải quyết được sự cố này bằng cách tạo lại quy trình đã lưu!
Chỉ cần đơn giản DROP và sau đó CREATE đã dừng các khoảng thời gian chờ trong trường hợp của tôi!

Tôi đã gặp phải vấn đề này trong một tuần; một ASP cổ điển cho biết "SQL timeout" khi tôi có thể chạy cùng một truy vấn trực tiếp trên cơ sở dữ liệu trong chưa đầy một giây. (Tôi không thấy thông báo "không tồn tại"). ASP đã hoạt động tốt trong cả tháng.

Một người bạn thiên tài của tôi cho biết: "Việc trải qua ASP sử dụng kế hoạch thực hiện 'được lưu trong bộ nhớ cache', điều này không hiệu quả. Hãy thử xóa và tạo lại. Điều này cho thấy quy trình lưu trữ của bạn có thể thực hiện bằng văn bản để làm cho nó nhiều hơn hiệu quả, vì nó có thể xảy ra lần nữa. "

Vì proc đã chạy tốt khi được thử nghiệm với SQL Management Studio, tôi giả định rằng không sử dụng gói được lưu trong bộ nhớ cache, nhưng ASP thực hiện.

+0

Đây là một câu trả lời rất rất tốt mà cần upvotes! Đã làm việc với ASP trong nhiều năm và chưa bao giờ gặp vấn đề này (may mắn vì các thủ tục của tôi không gây ra bất kỳ vấn đề nào) nhưng đây là thông tin rất tốt để ghi nhớ! Cảm ơn! – Digs

+0

Nếu kế hoạch được lưu trong bộ nhớ cache là sự cố, bạn có thể giải quyết vấn đề này với ít gián đoạn hơn bằng cách chỉ huy SQL đánh giá lại kế hoạch được lưu trong bộ nhớ cache một cách rõ ràng: "exec sp_recompile 'MyProcedure'" Điều này tránh được các vấn đề với các thay đổi bất ngờ của quyền. – Bruce

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