2010-05-04 10 views
5

Por el momento estoy usando este código para comprobar si la base de datos es accesible:ADO.NET: ¿Una forma más rápida de verificar si se puede acceder al servidor de la base de datos?

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; 
} 

Si bien este código funciona bien, hay una desventaja. Si el servidor no está en línea, pasa aproximadamente 4 segundos completos intentando abrir la conexión antes de decidir que no está disponible.

¿Hay alguna manera de probar la conexión sin intentar abrirla realmente y esperando el tiempo de espera? Algo así como una base de datos equivalente de ping?

+0

¿Espera que su servidor para estar abajo por mucho tiempo? –

+0

Debería cambiar eso a 'catch (SqlException)' – SLaks

Respuesta

-1

Sí y no.

Siempre puede observar qué puerto escucha su servidor, y luego intentar conectarlo directamente con un socket. Entonces, si tiene éxito, puede "asumir" que está en línea, pero puede no depender de su entorno de red. Sin embargo, ese es el enfoque más "ping". Por supuesto, puede ser que haya algo más escuchando allí, pero eso probablemente sea improbable en un entorno estándar en el que el DB está temporalmente inactivo.

Además, si su DB está en una máquina dedicada, puede en realidad ping it. Pero eso solo verificará si la máquina está funcionando, no el servidor de bases de datos.

La última opción sería tener algún servidor de fondo que monitoree constantemente el servidor de bases de datos, y cuando lo detecte que está fuera de línea, marcará algo apropiadamente. Su aplicación verificaría esa cosa (efectivamente un caché) y sería prácticamente inmediata. Por supuesto, significa que puede dar falsos negativos (es decir, el servidor podría estar en línea pero el servicio de monitoreo aún no ha actualizado la caché).

2

Mi método (después de conectar con éxito) es hacer un selecto que no depende de las tablas, por ejemplo el tiempo. En MS SQL Server:

"seleccione Sysdatetime()"

Cuestiones relacionadas