Hết thời gian chờ kết nối cho máy chủ SQL


109

Tôi có thể tăng thời gian chờ bằng cách sửa đổi chuỗi kết nối trong web.config?


7
Đừng đọc điều này như tôi đã nghĩ thời gian chờ sẽ kiểm soát việc thực thi truy vấn - nó không, chỉ hết thời gian chờ để kết nối với máy chủ - "thời gian chờ kết nối" sẽ là một cái tên tốt hơn. Xem stackoverflow.com/a/7976867/409856
downwitch

Câu trả lời:


213

Có, bạn có thể thêm ;Connection Timeout=30vào chuỗi kết nối của mình và chỉ định giá trị bạn muốn.

Giá trị thời gian chờ được đặt trong thuộc Connection Timeouttính là thời gian được biểu thị bằng giây . Nếu thuộc tính này không được đặt, giá trị thời gian chờ cho kết nối là giá trị mặc định (15 giây).

Hơn nữa, đặt giá trị thời gian chờ thành 0, bạn đang chỉ định rằng nỗ lực kết nối của bạn sẽ chờ một khoảng thời gian vô hạn. Như được mô tả trong tài liệu, đây là điều bạn không nên đặt trong chuỗi kết nối của mình:

Giá trị 0 cho biết không có giới hạn và nên tránh trong Chuỗi kết nối vì nỗ lực kết nối chờ vô thời hạn.


4
Thời gian chờ này tính bằng phút hay giây?
user1

1
@ user1 "Khoảng thời gian (tính bằng giây) để đợi kết nối với máy chủ trước khi kết thúc nỗ lực và tạo ra lỗi."
Santux

5
FYI: Thời gian chờ kết nối = 0 là vô hạn.
Abdul Saboor

Bạn có thể cho ví dụ cho điều này? Tôi đang sử dụng EF6 một tôi có 3 triệu dữ liệu trong bảng của tôi khi tôi làm một số lợi nhuận chương trình quá trình timeout lỗi ... lưu ý: Tôi đang sử dụng chỉ mục trong bảng
saulyasar

4
@saulyasar Đây là thời gian chờ CONNECTION, không phải thời gian chờ COMMAND. Thời gian chờ của CONNECTION là khoảng thời gian nó sẽ cố gắng KẾT NỐI với máy chủ sql. Bạn muốn điều tra thời gian chờ COMMAND, là thời gian một thủ tục hoặc câu lệnh sẽ chạy trước khi hết thời gian.
granadaCoder

32

Hừm ...

Như Darin đã nói, bạn có thể chỉ định giá trị thời gian chờ kết nối cao hơn, nhưng tôi nghi ngờ đó thực sự là vấn đề.

Khi bạn gặp sự cố hết thời gian kết nối, đó thường là sự cố với một trong những điều sau:

  1. Cấu hình mạng - kết nối chậm giữa máy chủ web / hộp phát triển của bạn và máy chủ SQL. Việc tăng thời gian chờ có thể khắc phục điều này, nhưng sẽ khôn ngoan hơn nếu bạn điều tra vấn đề cơ bản.

  2. Chuỗi kết nối. Tôi đã gặp sự cố trong đó tên người dùng / mật khẩu không chính xác, vì một số lý do, sẽ xuất hiện lỗi hết thời gian chờ thay vì lỗi thực cho biết "quyền truy cập bị từ chối". Điều này không nên xảy ra, nhưng đó là cuộc sống.

  3. Chuỗi kết nối 2: Nếu bạn chỉ định tên của máy chủ không chính xác hoặc không đầy đủ (ví dụ: mysqlserverthay vì mysqlserver.webdomain.com), bạn sẽ gặp phải tình trạng hết thời gian chờ. Bạn có thể ping máy chủ bằng cách sử dụng tên máy chủ chính xác như được chỉ định trong chuỗi kết nối từ dòng lệnh không?

  4. Chuỗi kết nối 3: Nếu tên máy chủ có trong DNS của bạn (hoặc tệp máy chủ), nhưng trỏ đến một IP không chính xác hoặc không thể truy cập được, bạn sẽ gặp phải lỗi hết thời gian chờ thay vì lỗi máy không tìm thấy.

  5. Truy vấn bạn đang gọi đã hết thời gian chờ. Có thể có vẻ như kết nối với máy chủ là vấn đề, tuy nhiên, tùy thuộc vào cách ứng dụng của bạn được cấu trúc, bạn có thể chuyển nó đến giai đoạn mà truy vấn của bạn đang thực thi trước khi thời gian chờ xảy ra.

  6. Rò rỉ kết nối. Có bao nhiêu quy trình đang chạy? Có bao nhiêu kết nối mở? Tôi không chắc liệu ADO.NET thô có thực hiện gộp kết nối, tự động đóng các kết nối khi cần thiết với Thư viện doanh nghiệp hay nơi tất cả những gì được định cấu hình. Đây có lẽ là một con cá trích đỏ. Tuy nhiên, khi làm việc với WCF và các dịch vụ web, tôi đã gặp vấn đề với các kết nối chưa được đóng kín gây ra thời gian chờ và các hành vi không thể đoán trước khác.

Những điều nên thử:

  1. Bạn có bị hết thời gian chờ khi kết nối với máy chủ bằng SQL Management Studio không? Nếu vậy, cấu hình mạng có thể là vấn đề. Nếu bạn không thấy sự cố khi kết nối với Management Studio, thì sự cố sẽ nằm ở ứng dụng của bạn, không phải ở máy chủ.

  2. Chạy SQL Profiler và xem những gì thực sự đang diễn ra trên dây. Bạn sẽ có thể biết liệu bạn đang thực sự kết nối hay một truy vấn là vấn đề.

  3. Chạy truy vấn của bạn trong Management Studio và xem mất bao lâu.

Chúc may mắn!


nếu truy vấn của bạn là thời điểm ra sau đó tôi đoán bạn sẽ nhận được một CommandTimeout
user55474

@ user55474 có lẽ; phụ thuộc ( rất hiếm) vào cách nó được gọi.
3Dave

Không theo bài viết trên blog MSDN này: blogs.msdn.com/b/spike/archive/2008/07/31/...
tom Redfern

@h Mặc dù tôi tin rằng tôi đã nói nó rất hiếm, nhưng tôi đã thấy nó tận mắt.
3Dave

1
+1 cho "Chạy SQL Profiler". Nghe có vẻ phức tạp nhưng bạn thực sự chỉ cần nhấp vào "Công cụ> SQL Server Profiler" và xem ứng dụng của bạn đang nói gì với SQL Server. Hóa ra của tôi là Lựa chọn số 5 :)
Andrew Kvochick

11

Nếu bạn muốn thay đổi động nó, tôi thích sử dụng SqlConnectionStringBuilder .

Nó cho phép bạn chuyển đổi ConnectionString tức là một chuỗi thành Đối tượng lớp, Tất cả các thuộc tính của chuỗi kết nối sẽ trở thành Thành viên của nó.

Trong trường hợp này, lợi thế thực sự sẽ là bạn không phải lo lắng về việc Nếu phần chuỗi ConnectionTimeout đã tồn tại trong chuỗi kết nối hay chưa?

Cũng vì nó tạo ra một Đối tượng và nó luôn tốt để gán giá trị trong đối tượng hơn là thao tác chuỗi.

Đây là mẫu mã:

var sscsb = new SqlConnectionStringBuilder(_dbFactory.Database.ConnectionString);

sscsb.ConnectTimeout = 30;

var conn = new SqlConnection(sscsb.ConnectionString);

2
Tôi không thể tin rằng làm cho thuộc ConnectionTimeouttính ở SqlConnectionloại chỉ đọc được cho là một ý tưởng hay.
Maslow
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.