2011-10-14 14 views
26

estoy (con éxito) que conecta a una base de datos utilizando la siguiente:Java JDBC estado de la conexión

java.sql.Connection connect = DriverManager.getConnection(
    "jdbc:mysql://localhost/some_database?user=some_user&password=some_password"); 

¿Qué debería estar comprobación para ver si la conexión sigue abierta y después de algún tiempo?
Esperaba algo como connect.isConnected(); disponible para mi uso.

Respuesta

15

Nada. Simplemente ejecuta tu consulta. Si la conexión ha muerto, su controlador JDBC se volverá a conectar (si lo admite, y lo habilitó en su cadena de conexión, la mayoría no lo admite) o de lo contrario obtendrá una excepción.

Si comprueba que la conexión ha finalizado, es posible que se caiga antes de que realmente ejecute su consulta, por lo que no obtendrá absolutamente nada mediante la comprobación.

Dicho esto, muchos grupos de conexiones validan una conexión haciendo algo como SELECT 1 antes de entregar las conexiones. Pero esto no es más que la ejecución de una consulta, por lo que puede ejecutar su consulta comercial.

+1

Hay una ganancia definitiva en probar la conexión antes de usarla (especialmente si se trata de una conexión de larga duración y la red subyacente podría haberla utilizado). Pero esto también es preciso en el sentido de que aún necesita manejar los errores en su propio código, ya que podría reducirse en cualquier momento. – rogerdpack

12

Utilice la función Connection.isClosed().

Los JavaDoc estados:

Recupera si este objeto Connection ha sido cerrado. Una conexión se cierra si se ha llamado al método close o si se han producido ciertos errores fatales. Este método está garantizado a return true solo cuando se invoca después de haber llamado al método Connection.close .

+3

A medida que el javadoc dice que esto no ** ** dar una respuesta válida en este caso. Solo dirá si 'close()' ha sido llamado o no. –

+1

Bien después de experimentar con el controlador JDBC de Postgres (al menos), básicamente, si la conexión subyacente "se pierde", 'isClosed()' seguirá siendo verdadero. Sin embargo, cuando * usa * la conexión y genera cualquier excepción, después de ese punto, 'isClosed()' ahora devolverá true. Así que, básicamente, puede "escaparse" con el uso de 'isClosed' (y evitar la latencia de una llamada adicional a' isValid() ') si de alguna manera puede permitirse una consulta interrumpida aquí o allá. Aparte de eso, 'isValid()' es una buena forma de probar, pero requiere un tiempo adicional de ida y vuelta. – rogerdpack

+0

Gracias, hombre ... Funcionó a las mil maravillas. –

33

Su mejor oportunidad es simplemente realizar una consulta simple en contra de una mesa, por ejemplo:

select 1 from SOME_TABLE; 

Oh, acabo de ver que hay un nuevo método disponible desde 1,6:

java.sql.Connection.isValid(int timeoutSeconds):

Devuelve verdadero si la conexión no se ha cerrado y sigue siendo válida. El controlador debe enviar una consulta sobre la conexión o utilizar algún otro mecanismo que compruebe positivamente que la conexión sigue siendo válida cuando se llame a . La consulta enviada por el controlador para validar la conexión se ejecutará en el contexto de la transacción actual .

+0

postgresql jdbc ejecuta "seleccionar 1", para el registro. – rogerdpack

3

Si está utilizando MySQL

public static boolean isDbConnected() { 
    final String CHECK_SQL_QUERY = "SELECT 1"; 
    boolean isConnected = false; 
    try { 
     final PreparedStatement statement = db.prepareStatement(CHECK_SQL_QUERY); 
     isConnected = true; 
    } catch (SQLException | NullPointerException e) { 
     // handle SQL error here! 
    } 
    return isConnected; 
} 

no he probado con otras bases de datos. Espero que esto sea útil.

+0

¿De dónde viene 'db'? – MonoThreaded

+0

Ver en la variable 'connect' de la pregunta es 'db' como lo nombre. –

+0

Luego es posible que desee cerrar su estado PreparedStatement para evitar fugas de memoria – MonoThreaded

4

También puede utilizar

public boolean isDbConnected(con Connection) { 
    //final String CHECK_SQL_QUERY = "SELECT 1"; 
    try { 
     if(!con.isClosed() || con!=null){ 
      return true; 
     } 
    } catch (SQLException e) { 
     return false; 
    } 
    return false; 
} 
+2

Debería ser, if (con! = Null ||! Con.isClosed()) para que su cheque está en el objeto primero, si es nulo, no continuará con la validación de la declaración IF. Tu arrojará una excepción porque con podría ser NULL. Entonces no necesitas todo el try catch en absoluto. – Switch

Cuestiones relacionadas