Sự khác biệt giữa SqlCommand.CommandTimeout và SqlConnection.ConnectionTimeout là gì?


88

Có sự khác biệt nào giữa SqlCommand.CommandTimeoutSqlConnection.ConnectionTimeouttrong .NET không?


điều này có dành riêng cho MS SQL Server không?
ympostor

Câu trả lời:


127

Đúng. CommandTimeoutlà bao lâu một lệnh có thể hoàn thành. ConnectionTimeoutlà thời gian có thể bắt đầu kết nối với máy chủ.

Ví dụ: bạn có thể đang thực hiện các truy vấn tương đối dài - hoàn toàn ổn nếu chúng mất 10 phút để hoàn thành, nhưng nếu mất 10 phút để bắt đầu kết nối, bạn sẽ biết rằng đã có điều gì đó không ổn.


5
Để thuận tiện cho việc tranh luận, giả sử tôi có! ** & # Q @? truy vấn mất 32 giây để chạy. Nếu tôi đặt SqlCommand.CommandTimeout = 40 nhưng để SqlConnection.ConnectionTimeout ở chế độ mặc định (có lẽ là 30), kết nối có hết thời gian chờ không? Nói cách khác, tôi có phải đặt cả hai thuộc tính không? Có vẻ như bạn đang nói "không", nhưng chắc hẳn tôi đã quên thuộc tính SqlConnection.ConnectionTimeout và bắt đầu đặt câu hỏi liệu thiết lập CommandTimeout có thực hiện mọi thứ tôi cần hay không.
flipdoubt

29
flipdoubt - CommandTimeout sẽ ảnh hưởng đến truy vấn, ConnectionTimout thì không. ConnectionTimout không phải là thời gian chờ kết nối đến các truy vấn biểu mẫu - nó chỉ là thời gian chờ để kết nối kết nối với cơ sở dữ liệu ngay từ đầu.
Robin Bennett

1
@JonSkeet làm CommandTimeout và ConnectionTimeout, cả hai đều tạo ra cùng một ngoại lệ chung? Hoặc các trường hợp ngoại lệ khác nhau?
Yasser Shaikh

1
@Yasser: Tôi không biết, tôi sợ.
Jon Skeet

6
Hãy nhớ rằng CommandTimeout dường như chỉ áp dụng cho đến khi hàng đầu tiên được trả về từ SQL Server cho mã máy khách. Ví dụ: nếu bạn có truy vấn trả lại hàng đầu tiên trong vòng 30 giây, nhưng tập hợp hàng hoàn chỉnh mất hàng giờ để trả lại, việc đặt thời gian chờ thành 30 giây sẽ không hết thời gian chờ truy vấn và truy vấn sẽ chạy trong nhiều giờ. Đây chủ yếu là trường hợp nếu bạn không có toán tử chặn (chẳng hạn như Lệnh theo) trên LHS của kế hoạch thực hiện của bạn. (Gửi bài vì tôi đã dành 2 ngày gỡ lỗi này và không có tài liệu tham khảo khác về đề tài này)
Dave

28

SqlCommand.CommandTimeout= giới hạn thời gian chờ cho truy vấn SQL của bạn. Phương tiện, bao nhiêu thời gian một (ví dụ: SELECT, UPDATE) truy vấn có thể lấy để thực hiện nó. Nếu vượt quá SqlCommand.CommandTimeout, thì nó sẽ ngừng thực thi. Lỗi hết thời gian lệnh sẽ xảy ra.

SqlConnection.ConnectionTimeout= giới hạn thời gian chờ cho kết nối của bạn. Có nghĩa là, đối tượng kết nối của bạn có thể cố gắng kết nối trong bao lâu. Nếu vượt quá thời gian quy định, nó sẽ ngừng kết nối. Lỗi hết thời gian kết nối sẽ xảy ra.


11

ConnectionTimeoutchỉ định khoảng thời gian chờ trước khi hết thời gian khi cố gắng mở một SqlConnection. Nó có liên quan đến Connection.Open()lệnh.

trong khi

SqlCommand.CommandTimeoutđã chỉ định khoảng thời gian để một SqlCommand đợi trước khi hết thời gian. Điều này xảy ra sau khi một kết nối đã được mở và một trong các ExecuteXXXphương thức đã được gọi trên đối tượng Command.


8

Thông tin bổ sung

Giá trị mặc định của CommandTimeoutlà 30 giây. Số không (0) cho biết không có giới hạn. Bạn chỉ có thể đặt CommandTimeoutgiá trị trong Mã hóa.

Giá trị mặc định của ConnectiontTimeoutlà 15 giây. Số không (0) cũng cho biết không có giới hạn. Giá trị nhỏ hơn 0 (giá trị trừ) sẽ nhận được ArgumentException. Bạn có thể đặt ConnectionTimeoutgiá trị trong cả tệp Coding và Config.


0
select @@LOCK_TIMEOUT //get the TIMEOUT,default is -1
set LOCK_TIMEOUT = 600//set TIMEOUT with ms

2
Đây là loại thời gian chờ thứ 3. Không phải một trong hai chủ đề mà chủ đề hỏi. Và không trả lời câu hỏi. Tôi sẽ không -1 nó, vì tôi không biết câu hỏi trước khi chỉnh sửa là gì.
Csaba Toth

0

Lưu ý nhanh về CommandTimeout, vì nó là thuộc tính của cả đối tượng Connection và Command ...

Cài đặt CommandTimeout trên đối tượng Connection không ảnh hưởng đến cài đặt CommandTimeout trên đối tượng Command trên cùng một kết nối; nghĩa là, thuộc tính CommandTimeout của đối tượng Command không kế thừa giá trị của giá trị CommandTimeout của đối tượng kết nối.

Vì vậy, cài đặt CommandTimeout trên một đối tượng Connection chỉ ảnh hưởng đến các lệnh được thực thi bên dưới đối tượng Connection mà thôi (không sử dụng đối tượng Command).

ví dụ: Khi bạn đang kết nối với một Stored Proc và thêm các tham số vào đối tượng lệnh và thực thi đối tượng Lệnh bằng cách sử dụng kết nối của Đối tượng Kết nối, thì bạn cần đặt CommandTimeout trên đối tượng Lệnh và ConnectionTimeout trên đối tượng Kết nối để ghi đè cả hai giá trị mặc định. Đặt CommandTimeout trên Đối tượng Kết nối sẽ không ghi đè thời gian chờ mặc định cho các lệnh Đối tượng Lệnh.

https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/commandtimeout-property-ado?view=sql-server-ver15 https://docs.microsoft.com/en-us / sql / ado / reference / ado-api / Connectiontimeout-property-ado? view = sql-server-ver15

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.