2009-05-11 29 views
12

Estoy tratando de determinar la mejor forma de hacer ping a una base de datos a través de JDBC. Por "mejor" me refiero a una sobrecarga rápida y baja. Por ejemplo, he considerado la ejecución de este:¿Cuál es la mejor manera de 'hacer ping' a una base de datos a través de JDBC?

"SELECT 1 FROM DUAL" 

pero creo que la tabla DUAL-Oracle es específica, y necesito algo más genérico.

Tenga en cuenta que Connection tiene un método isClosed(), pero el javadoc establece que esto no se puede utilizar para probar la validez de la conexión.

+0

(utilicé 'SELECT @@ VERSION' en MS SQL Server, pero ni siquiera es SQL.) –

Respuesta

5

Sí, eso sería solo Oracle, pero no hay una forma genérica de hacerlo en JDBC.

La mayoría de las implementaciones de grupos de conexiones tienen un parámetro de configuración donde puede especificar el SQL que se usará para hacer ping, lo que impulsa la responsabilidad de averiguar cómo hacerlo al usuario.

Ese parece ser el mejor enfoque a menos que alguien se le ocurre una pequeña herramienta de ayuda para esto (por supuesto, impide el uso de métodos potencialmente aún más rápido no basados ​​en SQL como Oracle's internal ping function)

+3

SELECT 1 FROM DUAL también funciona con MySQL. – Joset

+3

Ver mi respuesta, JDBC 4 tiene una forma genérica (de por qué no todos los controladores ofrecen JDBC 4 todavía). – eckes

1

puedo estar a comer en este caso, pero podría simplemente ejecutar alguna consulta no-sentido, tales como:

SELECT * FROM donkey_giraffe_87 

no sé mucho acerca de la gestión de errores de JDBC, pero tal vez se puede comprobar para ver si la base de datos es al menos diciendote que la mesa no existe Si los códigos de error de JDBC son específicos del proveedor, Spring Framework tiene algunas utilidades para asignar estos códigos a excepciones más significativas.

+0

Puede ser costoso intentar consultar una tabla no existente. Caché de diccionario falla y código de manejo de error. – Thilo

4

Tampoco conozco una solución genérica. Para UDB de IBM en iSeries (y tal vez otros sistemas DB2) sería

select 1 from SYSIBM.SYSDUMMY1; 
0

la simple emisión de la siguiente consulta debería ser suficiente

SELECT 1 
+0

que no funcionará con Oracle ... – Thilo

+2

ORA-00923: Palabra clave FROM no encontrada donde se esperaba – Thilo

0

¿Puede no simplemente ejecutar

SELECT 1 

sin una cláusula FROM contra la mayoría de las bases de datos?

+3

No con Oracle: ORA-00923: palabra clave FROM no encontrada donde se esperaba – Thilo

3

Puede tratar de obtener el nombre db de los metadatos de conexión y ejecutar un stadle de sql correspondiente. P.ej.

Connection con = null; 
Statement st = null; 
ResultSet rs = null; 
try { 
    con = dataSource.getConnection(); 
    String dbProductName = con.getMetaData().getDatabaseProductName(); 
    Statement st = con.createStatement(); 
    if ("PostgreSQL".equalsIgnoreCase(dbProductName)) { 
    rs = st.executeQuery("select version();"); 
    } else if ("Oracle".equalsIgnoreCase(dbProductName)) { 
    rs = st.executeQuery("select 1 from dual"); 
    } else { 
    ... 
    } 
} catch (Exception ex) { 
    System.out.prinln("DB not reachable"); 
} finally { 
    // close statement, connection etc. 
    ... 
} 
10

Con JDBC 4 se puede utilizar isValid(int) (JavaDoc) del conector de interface. Esto básicamente hace la declaración de prueba para ti.

1

MySQL tiene un buen mecanismo, documentado en este SO answer. A partir de la respuesta:

"/* ping */ SELECT 1" 

En realidad, esto hará que el controlador envía un ping al servidor y devuelve un falso, de peso ligero, conjunto de resultados.

Habiendo dicho eso, @eckes answer es el mejor (usando JDBC 4's Connection.isValid(int)).

Cuestiones relacionadas