특정 데이터베이스 서버가 연결되어 있는지 여부를 테스트 할 수있는 방법이 있습니까? 핑 동작처럼.SQL Db 연결 테스트
다른 방법으로는 SQL 연결 열기를 테스트합니다. 그 접근법을 사용하지 않는 이유는 내 앱이 매 초마다 연결을 테스트한다는 것입니다.
감사
특정 데이터베이스 서버가 연결되어 있는지 여부를 테스트 할 수있는 방법이 있습니까? 핑 동작처럼.SQL Db 연결 테스트
다른 방법으로는 SQL 연결 열기를 테스트합니다. 그 접근법을 사용하지 않는 이유는 내 앱이 매 초마다 연결을 테스트한다는 것입니다.
감사
당신은 서버를 ping 할 수
http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx
그러나 DB가있는 경우이 당신을 말하지 않을 것이다. 연결을 여는 것 (아마도 인증하는 방법이 유일한 방법 일 것입니다). 왜 계속 이런 식으로 폴링하는거야?
내가 왜이 일을하는지 잘 모르겠다. 대답을 거의 받아들이지 않는다고 생각하지만, 여기에 있습니다. 귀하의 질문에 많은 쟁점이 제기됩니다. 그래서 & 내게
연결이 많은 것을 의미 할 수
연결 .... 나와 함께 곰. 훨씬 낮은 계층에서 @Paddy가 가리키는 것처럼 PING은 OS가 연결할 수있는 네트워크에 연결되어 있는지 알려줍니다. 그러나 컴퓨터를 연결하고 SQL을 중지하거나, 오프라인으로 만들거나, 오작동시킬 수 있습니다. SQL은 온라인 일 수 있지만 방화벽은 요청한 컴퓨터에서 액세스를 차단합니다. 요청하는 컴퓨터에 사용 권한이 없을 수 있습니다. 목록은 계속됩니다.
SQL Server에 대한 연결을 열 수있는 기능이이 연결을 테스트 할 수있는 방법입니다 : 여기
내 요점은 것입니다.
나라면 나는 비동기 스레드에 작은 ADO 테스트를 넣을 것이다. 이 테스트는 짧은 시간 제한을 사용하여 연결을 열려고 시도합니다.
증상 또는 문제점을 해결하려면?
SQL Server는 실제로 고 가용성 제품으로 설계되었으며 일반적으로 고 가용성 제품으로 고안되었습니다. 의미, 만약 당신의 SQL 액세스가 너무 많이 (일반적인 오류 처리기를 넘어) 그것을 테스트하려는 availability 문제를 해결하는 것이 좋습니다 나가고있다. 가장 기본적인 설치와 불운이 섞인 경우에도 95 % 이상의 시간이 필요합니다. 나는이 점을 설득하지 않은 경우
을 테스트하기 위해 SQL SMO를 사용
는 대안이있다. SQL SMO (SQL DMO의 대체)는 SQL 서버 관리에 프로그래밍 방식으로 액세스 할 수있게 해주는 일련의 객체입니다.
몇 객체에 대한 참조가 필요합니다 아래 코드 :
당신은 볼이 getting started 기사를 사용하는 방법을 설치 프로젝트에 . SQL Server에 연결하려면 WINDOWS 권한 (SQL 인증과 반대)이 필요합니다. 코드 위에 지금
는 : 데이터베이스가 그 이유를 사용할 수없는 경우
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo.Wmi;
namespace SQL_SMO_Test {
class Program {
public const string SQL_SERVICE_BASENAME = "MSSQL";
public static bool SQLServiceIsRunning (string SQLServerName) {
string[] nameComponents;
string ComputerName;
string InstanceName;
string ServiceName;
ManagedComputer mc;
ServiceCollection serviceList;
//split up SQL Name
nameComponents = SQLServerName.Split('\\');
ComputerName = nameComponents[0];
InstanceName = nameComponents.Length > 1 ? nameComponents[1] : "";
ServiceName = SQL_SERVICE_BASENAME +
((InstanceName.Length>0) ? "$" + InstanceName : "");
//get WMI Computer object
mc = new ManagedComputer(ComputerName);
serviceList = mc.Services;
//find any SQL Services & See if it's our instance
foreach (Service s in serviceList) {
if (s.Type.Equals(ManagedServiceType.SqlServer)) {
Console.WriteLine("Service Found --" + s.Name);
if ((!ServiceName.Contains('$')) || s.Name == ServiceName) {
Console.WriteLine("..Correct Instance found" + s.Name);
if (s.ServiceState.Equals(ServiceState.Running)){
Console.WriteLine("....Service is Running");
return true;
}
}
}
} //end foreach()
Console.WriteLine("service not found, or stopped");
return false; //service not found, or stopped
} //end SQLServiceIsRunning
/* format: servername\instanceIfAny */
public static bool SQLIsRunning(string SQLServerName) {
Server srv;
Console.WriteLine("SERVICE RUNNING (" + SQLServerName + ") ?");
Console.WriteLine("------------------------------");
if (! SQLServiceIsRunning(SQLServerName)) {
return false;
}
Console.WriteLine("------------------------------");
srv = new Server(SQLServerName);
try {
Console.WriteLine("Status: " + srv.Status.ToString());
return true;
} catch (Exception ex) {
Console.WriteLine("Exception: " + ex.ToString());
}
return false;
} //end SQLIsRunning()
static void Main(string[] args) {
bool result = SQLIsRunning("MST-SQL01.mst.com");
Console.WriteLine("-----------");
Console.WriteLine("Press any key to close...");
Console.ReadKey();
} //end main()
}
}
유용하게 보이지만 과중한 조작이 아닙니까? 죄송합니다. SMO에 대해 더 이상 알지 못합니다. 그래서 더 말할 수 없습니다. –
"너 무거운가요?"- 당신의 관점에 달려 있습니다. 모든 데이터베이스 연결과 마찬가지로 프로세스가 끝났고 네트워크 연결이 끊어 질 가능성이 있습니다. 따라서 나노 초가 아닌 밀리 초 단위로 시간을 측정합니다. 하지만 연결 시간 제한을 기다리는 것보다 빠릅니다. 그러나, 나는 나의 단언을지지한다 - 연결은 DB 가용성을 테스트하는 방법이다. 대기 시간에 신경 쓰지 않도록 비동기 스레드에 연결 테스트를하십시오. – EBarr
나는 응용 프로그램에서 수행되는 행동을 방지 할 수 있습니다. 그래서 DB가 연결되어 있지 않으면 앱이 잠길 것입니다. –
왜 데이터베이스를 다운시킬 때 오류 처리를 제공하지 않는가? (자주 사용하지 않아야한다.) 리소스를 사용하여 지속적으로이 서버를 검사하여 확인한다. – Paddy