De nombreuses bibliothèques de regroupement de connexions de base de données offrent la possibilité de tester leurs connexions SQL pour l'inactivité. Par exemple, la bibliothèque de regroupement JDBC c3p0 a une propriété appelée preferredTestQuery
, qui est exécutée sur la connexion à des intervalles configurés. De même, Apache Commons DBCP a validationQuery
.
De nombreux exemples de requêtes que j'ai vus concernent MySQL et recommandent de l'utiliser SELECT 1;
comme valeur pour la requête de test. Cependant, cette requête ne fonctionne pas sur certaines bases de données (par exemple HSQLDB, pour qui SELECT 1
attend une FROM
clause).
Existe-t-il une requête indépendante de la base de données qui est tout aussi efficace mais fonctionnera pour toutes les bases de données SQL?
Éditer:
S'il n'y en a pas (ce qui semble être le cas), quelqu'un peut-il suggérer un ensemble de requêtes SQL qui fonctionneront pour divers fournisseurs de bases de données? Mon intention serait de déterminer par programme une instruction que je peux utiliser en fonction de la configuration de mon fournisseur de base de données.
la source
Réponses:
Après un peu de recherche avec l'aide de certaines des réponses ici:
SELECT 1
SELECT 1 FROM DUAL
SELECT 1 FROM any_existing_table WHERE 1=0
ou
SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS
HSQLDB (testé avec la version 1.8.0.10)
Remarque: j'ai essayé d'utiliser une
WHERE 1=0
clause sur la deuxième requête, mais cela ne fonctionnait pas comme valeur pour Apache Commons DBCPvalidationQuery
, car la requête ne renvoie aucune ligneVALUES 1
ouSELECT 1 FROM SYSIBM.SYSDUMMY1
SELECT 1 FROM SYSIBM.SYSDUMMY1
select count(*) from systables
la source
VALUES 1
etSELECT 1 FROM SYSIBM.SYSDUMMY1
pour Apache DerbySi votre pilote est compatible JDBC 4, aucune requête dédiée n'est nécessaire pour tester les connexions. Au lieu de cela, il y a Connection.isValid pour tester la connexion.
JDBC 4 fait partie de Java 6 à partir de 2006 et votre pilote devrait le supporter maintenant!
Les pools de connexions célèbres, comme HikariCP, ont toujours un paramètre de configuration pour spécifier une requête de test, mais déconseillent fortement de l'utiliser:
la source
Malheureusement, aucune instruction SELECT ne fonctionnera toujours quelle que soit la base de données.
La plupart des bases de données prennent en charge:
Certaines bases de données ne prennent pas en charge cela mais ont une table appelée DUAL que vous pouvez utiliser lorsque vous n'avez pas besoin d'une table:
MySQL prend également en charge cela pour des raisons de compatibilité, mais toutes les bases de données ne le font pas. Une solution de contournement pour les bases de données qui ne prennent en charge aucun des éléments ci-dessus consiste à créer une table appelée DUAL qui contient une seule ligne, puis ce qui précède fonctionnera.
HSQLDB ne prend en charge ni l'un ni l'autre des éléments ci-dessus, vous pouvez donc soit créer la table DUAL, soit utiliser:
la source
SELECT 1 FROM DUAL
ne fonctionne pas non plus avec HSQLDB.J'utilise celui-ci:
pour vérifier la connexion et la capacité à exécuter des requêtes (avec 1 ligne comme résultat) pour postgreSQL, MySQL et MSSQL.
la source
j'utilise
pour hsqldb 1.8.0
la source
Pour les tests utilisant
select count(*)
, il devrait être plus efficace à utiliserselect count(1)
car il*
peut le faire lire toutes les données de la colonne.la source
select 1
fonctionnerait dans le serveur SQL, pas sûr des autres.Utilisez la norme ansi sql pour créer une table, puis interrogez cette table.
la source
create table
?En supposant que l'OP souhaite une réponse Java:
Depuis JDBC3 / Java 6, il existe la méthode isValid () qui devrait être utilisée plutôt que d'inventer sa propre méthode.
L'implémenteur du pilote doit exécuter une sorte de requête sur la base de données lorsque cette méthode est appelée. En tant que simple utilisateur JDBC, vous n'avez pas besoin de savoir ou de comprendre ce qu'est cette requête. Tout ce que vous avez à faire est de vous assurer que le créateur du pilote JDBC a fait son travail correctement.
la source
Que diriez-vous
J'utilise ça avant. MySQL, H2 est OK, je ne connais pas les autres.
la source
Je viens de découvrir à la dure que c'est
pour MaxDB également.
la source
Pour Oracle, la requête la plus performante sera
C'est du point de vue de la performance.
la source
J'utilise ceci pour Firebird
la source
Pour MSSQL .
Cela m'a aidé à déterminer si les serveurs liés étaient actifs. Utilisation d'une connexion Open Query et d'un TRY CATCH pour mettre les résultats de l'erreur en quelque chose d'utile.
docs.microsoft.com
la source