2010-05-04 35 views
5

Hiện nay tôi đang sử dụng mã này để kiểm tra xem cơ sở dữ liệu có thể truy cập:ADO.NET: Cách nhanh hơn để kiểm tra xem máy chủ cơ sở dữ liệu có thể truy cập được không?

public bool IsDatabaseOnline(string con) 
{ 
    bool isConnected = false; 
    SQLConnection connect = null; 

    try { 
     connect = new SQLConnection(con); 
     connect.Open(); 
     isConnected = true; 

    } catch (Exception e) { 
     isConnected = false; 

    } finally { 
     if (connect != null) 
      connect.Close(); 
    } 

    return isConnected; 
} 

Trong khi mã này hoạt động tốt, có một bất lợi. Nếu máy chủ không trực tuyến, nó sẽ mất khoảng 4 giây để mở kết nối trước khi quyết định rằng nó không có sẵn.

Có cách nào để kiểm tra kết nối mà không thực sự mở kết nối và chờ thời gian chờ không? Một cái gì đó giống như một cơ sở dữ liệu tương đương với ping?

+0

Bạn có muốn máy chủ của bạn sẽ được giảm trong một thời gian dài? –

+0

Bạn nên thay đổi điều đó thành 'catch (SqlException)' – SLaks

Trả lời

3

Bạn chỉ có thể thay đổi thời gian chờ kết nối ngắn hơn. Thực hiện một số thử nghiệm và xem mức độ thấp mà bạn có thể tiếp tục và vẫn đáng tin cậy. Tôi đặt cược bạn có thể nhận được gần 500ms.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx

+2

Bạn muốn chỉ định 500 mili giây nếu 'ConnectionTimeout' bằng giây như thế nào? –

-1

Có và không.

Bạn luôn có thể lưu ý cổng nào máy chủ của bạn sẽ nghe, sau đó thử và kết nối trực tiếp với cổng đó bằng ổ cắm. Sau đó, nếu bạn thành công, bạn có thể "giả định" nó trực tuyến, nhưng nó có thể không phụ thuộc vào môi trường mạng của bạn. Đó là cách "ping" nhất như cách tiếp cận. Tất nhiên, nó có thể là một cái gì đó khác đang lắng nghe ở đó, nhưng đó có thể là không trong một môi trường tiêu chuẩn, nơi DB chỉ là tạm thời xuống.

Ngoài ra, nếu DB của bạn trên một máy chuyên dụng, bạn có thể thực sự ping nó. Nhưng điều đó sẽ chỉ kiểm tra xem máy có hoạt động không, không phải máy chủ DB.

Tùy chọn cuối cùng, sẽ có một số máy chủ nền liên tục giám sát máy chủ DB và khi phát hiện thấy nó đang ngoại tuyến, nó đánh dấu điều gì đó phù hợp. Sau đó, ứng dụng của bạn sẽ kiểm tra rằng điều (hiệu quả là bộ nhớ cache) và nó sẽ gần như ngay lập tức. Tất nhiên, điều đó có nghĩa là nó có thể đưa ra các âm bản sai (tức là máy chủ có thể trực tuyến nhưng dịch vụ giám sát chưa cập nhật bộ nhớ cache).

2

phương pháp của tôi (sau khi thành công kết nối) là để thực hiện một lựa chọn mà không phụ thuộc vào bảng, cho thời gian ví dụ. Trong MS SQL Server:

"chọn Sysdatetime()"

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