Muchas bibliotecas de agrupación de conexiones de bases de datos proporcionan la capacidad de probar sus conexiones SQL en busca de inactividad. Por ejemplo, la biblioteca de agrupación JDBC c3p0 tiene una propiedad llamada preferredTestQuery
, que se ejecuta en la conexión a intervalos configurados. Del mismo modo, Apache Commons DBCP tiene validationQuery
.
Muchas consultas de ejemplo que he visto son para MySQL y recomiendo usarlas como el valor para la consulta de prueba. Sin embargo, esta consulta no funciona en algunas bases de datos (por ejemplo, HSQLDB, para lo cual se espera una cláusula).SELECT 1;
SELECT 1
FROM
¿Existe una consulta independiente de la base de datos que sea igualmente eficiente pero funcione para todas las bases de datos SQL?
Editar:
Si no existe (que parece ser el caso), ¿alguien puede sugerir un conjunto de consultas SQL que funcionarán para varios proveedores de bases de datos? Mi intención sería determinar mediante programación una declaración que pueda usar según la configuración de mi proveedor de base de datos.
fuente
Respuestas:
Después de un poco de investigación junto con la ayuda de algunas de las respuestas aquí:
SELECT 1
SELECT 1 FROM DUAL
SELECT 1 FROM any_existing_table WHERE 1=0
o
SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS
HSQLDB (probado con la versión 1.8.0.10)
Nota: Intenté usar una
WHERE 1=0
cláusula en la segunda consulta, pero no funcionó como un valor para los DBCP de Apache CommonsvalidationQuery
, ya que la consulta no devuelve ninguna filaVALUES 1
oSELECT 1 FROM SYSIBM.SYSDUMMY1
SELECT 1 FROM SYSIBM.SYSDUMMY1
select count(*) from systables
fuente
VALUES 1
ySELECT 1 FROM SYSIBM.SYSDUMMY1
para Apache DerbySi su controlador es compatible con JDBC 4, no hay necesidad de una consulta dedicada para probar las conexiones. En cambio, hay Connection.isValid para probar la conexión.
¡JDBC 4 es parte de Java 6 desde 2006 y su controlador ya debería ser compatible con esto!
Los grupos de conexiones famosos, como HikariCP, todavía tienen un parámetro de configuración para especificar una consulta de prueba, pero desaconsejamos utilizarlo:
fuente
Desafortunadamente, no hay una instrucción SELECT que siempre funcione independientemente de la base de datos.
La mayoría de las bases de datos son compatibles:
Algunas bases de datos no admiten esto, pero tienen una tabla llamada DUAL que puede usar cuando no necesita una tabla:
MySQL también admite esto por razones de compatibilidad, pero no todas las bases de datos lo hacen. Una solución alternativa para las bases de datos que no admiten ninguno de los anteriores es crear una tabla llamada DUAL que contenga una sola fila, entonces lo anterior funcionará.
HSQLDB no admite ninguno de los anteriores, por lo que puede crear la tabla DUAL o usar:
fuente
SELECT 1 FROM DUAL
tampoco funciona con HSQLDB.Yo uso este:
para verificar la conexión y la capacidad de ejecutar consultas (con 1 fila como resultado) para postgreSQL, MySQL y MSSQL.
fuente
yo suelo
para hsqldb 1.8.0
fuente
Para el uso de pruebas
select count(*)
, debería ser más eficiente de usarselect count(1)
porque*
puede hacer que lea todos los datos de la columna.fuente
select 1
funcionaría en el servidor sql, no estoy seguro acerca de los demás.Use ansi sql estándar para crear una tabla y luego consulte desde esa tabla.
fuente
create table
?Asumiendo que el OP quiere una respuesta Java:
A partir de JDBC3 / Java 6 está el isValid () método que debería usarse en lugar de inventar el propio método.
Se requiere que el implementador del controlador ejecute algún tipo de consulta en la base de datos cuando se llama a este ID de método. Usted, como simple usuario de JDBC, no tiene que saber ni comprender qué es esta consulta. Todo lo que tiene que hacer es confiar en que el creador del controlador JDBC ha hecho su trabajo correctamente.
fuente
Qué tal si
Lo uso antes. MySQL, H2 está bien, no conozco a otros.
fuente
Me acabo de enterar por las malas que es
para MaxDB también.
fuente
Para Oracle, la consulta de alto rendimiento será
Esto es desde una perspectiva de rendimiento.
fuente
Yo uso esto para Firebird
fuente
Para MSSQL .
Esto me ayudó a determinar si los servidores vinculados estaban vivos. Usando una conexión de consulta abierta y un TRY CATCH para poner los resultados del error en algo útil.
docs.microsoft.com
fuente