2008-08-19 36 views
32

Tất cả bây giờ và sau đó trong một ứng dụng .NET lượng cao, bạn có thể thấy ngoại lệ này khi bạn cố gắng thực hiện một truy vấn:Làm thế nào để bạn xử lý các lỗi mức vận tải trong SqlConnection?

System.Data.SqlClient.SqlException: A transport-level error has occurred when sending the request to the server.

Theo nghiên cứu của tôi, đây là cái gì mà "chỉ xảy ra" và không có nhiều có thể được thực hiện để ngăn chặn nó. Nó không xảy ra là kết quả của một truy vấn xấu, và thường không thể được nhân đôi. Nó chỉ là cây trồng lên có thể một lần mỗi vài ngày trong một hệ thống OLTP bận rộn khi kết nối TCP đến cơ sở dữ liệu đi xấu vì một lý do nào đó.

Tôi buộc phải phát hiện lỗi này bằng cách phân tích cú pháp thông báo ngoại lệ và sau đó thử lại toàn bộ thao tác từ đầu, để bao gồm việc sử dụng kết nối mới. Không ai trong số đó là đẹp.

Có ai có giải pháp thay thế nào không?

+0

Tăng RAM –

+0

Bạn có thống kê về tải trên máy chủ cơ sở dữ liệu của mình khi các lỗi này được ném không? Bạn có thể có một số vấn đề về cơ sở dữ liệu đang gây ra các kết nối không thành công. –

+1

Điều này * không nên * xảy ra, ngay cả dưới khối lượng giao dịch cao. Chúng tôi chạy trung bình 25.000 giao dịch mỗi giây trên Chuẩn SQL Server 2005 và chúng tôi không gặp phải lỗi này. (Trừ khi cụm không thành công, cứ 12 tháng một lần, không phải vài ngày.) Nếu không có thêm thông tin, có vẻ như có sự cố mạng giữa máy chủ cơ sở dữ liệu và máy chủ ứng dụng của bạn. Bạn có thể đăng thêm thông tin? – Portman

Trả lời

0

Tôi đang sử dụng lớp độ tin cậy xung quanh lệnh DB của tôi (abstracted xa trong interfaece kho). Về cơ bản đó chỉ là mã mà chặn bất kỳ ngoại lệ mong đợi nào (DbException và cũng là InvalidOperationException, điều đó xảy ra để bị ném vào các vấn đề kết nối), ghi lại, thu thập số liệu thống kê và thử lại mọi thứ một lần nữa.

Với lớp độ tin cậy hiện tại, dịch vụ đã có thể tồn tại một cách duyên dáng kiểm tra căng thẳng (ổ khóa chết liên tục, lỗi mạng vv). Sản xuất kém thù địch hơn thế.

PS: There is more on that here (cùng với một cách đơn giản để xác định độ tin cậy với DSL đánh chặn)

2

Để trả lời câu hỏi ban đầu của bạn:

Một cách thanh lịch hơn để phát hiện lỗi đặc biệt này, mà không phân tích được thông báo lỗi , là để kiểm tra tài sản Number của SqlException.

(Điều này thực sự trả về số lỗi từ SqlError đầu tiên trong bộ sưu tập Errors, nhưng trong trường hợp của bạn các lỗi giao thông nên là người duy nhất trong bộ sưu tập.)

+0

+1 Không một câu trả lời, nhưng là ý tưởng hữu ích. –

0

tôi đã cùng một vấn đề. Tôi hỏi những người bạn đam mê mạng của mình, và tất cả đều nói những gì mọi người đã trả lời ở đây: Đó là kết nối giữa máy tính và máy chủ cơ sở dữ liệu. Trong trường hợp của tôi đó là nhà cung cấp dịch vụ Internet của tôi, hoặc có bộ định tuyến đó là vấn đề. Sau khi cập nhật Router, vấn đề đã biến mất. Nhưng bạn có bất kỳ một kết nối internet nào khác từ máy tính hoặc máy chủ của bạn không? Tôi đã có ...

8

Tôi đã đăng an answer on another question trên một chủ đề khác có thể có một số sử dụng tại đây. Câu trả lời đó liên quan đến các kết nối SMB, chứ không phải SQL. Tuy nhiên, nó giống hệt nhau ở chỗ nó liên quan đến lỗi vận chuyển ở mức độ thấp.

Điều chúng tôi thấy là trong trường hợp tải nặng, máy chủ từ xa có thể dễ dàng hết thời gian kết nối ở lớp TCP đơn giản vì máy chủ bận. Một phần của lý do là mặc định cho bao nhiêu lần TCP sẽ truyền lại dữ liệu trên Windows không phù hợp với hoàn cảnh của chúng ta.

Hãy xem registry settings for tuning TCP/IP trên Windows.Cụ thể là bạn muốn xem TcpMaxDataRetransmissions và có thể TcpMaxConnectRetransmissions. Các giá trị mặc định là 5 và 2 tương ứng, hãy thử tăng cường chúng một chút trên hệ thống máy khách và nhân đôi tình trạng tải.

Đừng phát điên! TCP tăng gấp đôi thời gian chờ với mỗi lần truyền lại liên tiếp, do đó, hành vi thời gian chờ cho các kết nối xấu có thể đi theo cấp số nhân đối với bạn nếu bạn tăng quá nhiều. Khi tôi nhớ lại số tiền TcpMaxDataRetransmissions đến 6 hoặc 7 giải quyết được vấn đề của chúng tôi trong phần lớn các trường hợp.

1

Tôi đã thấy điều này xảy ra trong môi trường của riêng tôi một số lần. Ứng dụng máy khách trong trường hợp này được cài đặt trên nhiều máy. Một số trong những máy này xảy ra là máy tính xách tay mọi người đã rời khỏi ứng dụng mở ngắt kết nối nó và sau đó cắm nó trở lại và cố gắng sử dụng nó. Điều này sau đó sẽ gây ra lỗi bạn đã đề cập.

Điểm đầu tiên của tôi là xem mạng và đảm bảo rằng máy chủ không có trên DHCP và gia hạn địa chỉ IP gây ra lỗi này. Nếu đó không phải là trường hợp thì bạn phải bắt đầu tìm kiếm thông qua các bản ghi sự kiện của bạn để tìm kiếm các mạng khác có liên quan.

Thật không may, như đã nêu ở trên lỗi mạng. Điều chính bạn có thể làm là chỉ giám sát các kết nối bằng cách sử dụng một công cụ như netmon và làm việc trở lại từ đó.

Chúc may mắn.

3

Điều này blog post bởi Michael Aspengren giải thích thông báo lỗi "Đã xảy ra lỗi cấp vận tải khi gửi yêu cầu đến máy chủ".

0

Tôi đã có cùng một vấn đề mặc dù nó đã được với các yêu cầu dịch vụ cho một DB SQL.

Đây là những gì tôi đã có trong bản ghi lỗi dịch vụ của tôi:


System.Data.SqlClient.SqlException: Một lỗi vận chuyển cấp đã xảy ra khi gửi yêu cầu đến máy chủ. (nhà cung cấp: Nhà cung cấp TCP, lỗi: 0 - Kết nối hiện có bị đóng bởi máy chủ từ xa.)


Tôi có bộ kiểm tra C# thử nghiệm dịch vụ. Dịch vụ và DB đều ở trên các máy chủ bên ngoài nên tôi nghĩ đó có thể là vấn đề. Vì vậy, tôi đã triển khai dịch vụ và DB cục bộ để không có kết quả. Vấn đề vẫn tiếp tục. Bộ thử nghiệm thậm chí không phải là một bài kiểm tra hiệu năng nhấn mạnh, vì vậy tôi không biết chuyện gì đang xảy ra. Cùng một thử nghiệm đã thất bại mỗi lần, nhưng khi tôi vô hiệu hóa thử nghiệm đó, một thử nghiệm khác sẽ thất bại liên tục.

Tôi cố gắng gợi ý các phương pháp khác trên Internet mà không làm việc, hoặc:

  • Tăng giá trị registry của TcpMaxDataRetransmissionsTcpMaxConnectRetransmissions.
  • Tắt tùy chọn "Bộ nhớ chia sẻ" trong Trình quản lý cấu hình SQL Server trong "Giao thức ứng dụng khách" và sắp xếp TCP/IP thành 1 trong danh sách.
  • Điều này có thể xảy ra khi bạn đang thử nghiệm khả năng mở rộng với một số lượng lớn các nỗ lực kết nối khách hàng. Để giải quyết vấn đề này, sử dụng tiện ích regedit.exe để thêm giá trị DWORD mới có tên SynAttackProtect vào khóa đăng ký HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ với dữ liệu giá trị là 00000000.

Phương sách cuối cùng của tôi là sử dụng tuổi già nói "Thử và thử lại". Vì vậy, tôi có các câu lệnh try-catch lồng nhau để đảm bảo rằng nếu kết nối TCP/IP bị mất trong giao thức truyền thông thấp hơn thì nó không chỉ từ bỏ ở đó mà còn thử lại. Điều này bây giờ làm việc cho tôi, tuy nhiên nó không phải là một giải pháp rất thanh lịch.

+0

Cảm ơn bạn đã phản hồi. Nếu bạn đang sử dụng kết nối tổng hợp, hãy thử gọi SqlConnection.Recycle() cứ nói 10 phút để đảm bảo rằng nếu SQLServer đã giết chết một kết nối mà hồ bơi của bạn vẫn không cố gắng tận dụng nó. Nên công việc này, báo cáo lại! – TheLegendaryCopyCoder

1

sử dụng Dịch vụ của doanh nghiệp với các thành phần giao dịch

0

Theo tôi có thể biết, lớp 20 là cấp độ truyền tải.

0

Tôi gặp lỗi giao thông trong sáng nay trong SSMS khi kết nối với SQL 2008 R2 Express.

Tôi đang cố gắng nhập CSV bằng \ r \ n. Tôi mã hóa terminator hàng của tôi cho 0x0d0x0a. Khi tôi thay đổi nó thành 0x0a, lỗi dừng lại. Tôi có thể thay đổi nó qua lại và xem nó xảy ra/không xảy ra.

BULK INSERT #t1 FROM 'C:\123\Import123.csv' WITH 
     (FIRSTROW = 1, FIELDTERMINATOR = ',', ROWTERMINATOR = '0x0d0x0a') 

Tôi nghi ngờ tôi không viết trình kết thúc hàng chính xác vì SQL phân tích cú pháp một ký tự cùng lúc trong khi tôi đang cố chuyển hai ký tự.

Dù sao đi nữa, lỗi này hiện là 4 tuổi nhưng có thể cung cấp một chút thông tin cho người dùng tiếp theo.

+0

Tôi nghĩ rằng vấn đề ở đây là các rowterminator được coi là một giá trị nhị phân duy nhất, mà cho SQL server sẽ được viết là 0x0d0a (không có thứ hai 0x). – Zastai

+0

Xin chào! Đó là slick! Tối nay tôi sẽ cố gắng! –

0

Tôi chỉ muốn đăng một bản sửa lỗi tại đây làm việc cho công ty của chúng tôi về phần mềm mới mà chúng tôi đã cài đặt. Chúng tôi đã nhận được lỗi sau kể từ ngày 1 trên tệp nhật ký máy khách: Máy chủ không thể xử lý yêu cầu. ---> Đã xảy ra lỗi khi vận chuyển khi nhận kết quả từ máy chủ. (nhà cung cấp: Nhà cung cấp TCP, lỗi: 0 - Thời gian hết hạn semaphore đã hết hạn.) ---> Thời gian hết hạn semaphore đã hết hạn.

Điều gì đã khắc phục được sự cố hoàn toàn là thiết lập tổng hợp liên kết (LAG) trên công tắc của chúng tôi. Máy chủ Dell FX1 của chúng tôi có các dòng sợi dư thừa sắp ra khỏi mặt sau của nó. Chúng tôi đã không nhận ra rằng công tắc mà họ đang cắm vào cần thiết để có LAG được cấu hình trên hai cổng đó. Xem chi tiết tại đây: https://docs.meraki.com/display/MS/Switch+Ports#SwitchPorts-LinkAggregation

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