172 votes

De test efficace SQL requête ou une requête de validation qui fonctionne sur tout (ou presque) de bases de données

Beaucoup de connexion de base de données mise en commun des bibliothèques offrent la possibilité de tester leurs connexions SQL pour l'oisiveté. Par exemple, le JDBC mise en commun de la bibliothèque de c3p0 a une propriété appelée preferredTestQuery, qui est exécuté sur la connexion à des intervalles configurés. De même, Apache Commons DBCP a validationQuery.

De nombreux exemple de requêtes , j'ai vu sont pour MySQL et recommandons l'utilisation d' SELECT 1; la valeur de 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 s'attend à un FROM de la clause).

Est-il une base de données agnostique requête, de manière équivalente, efficace mais fonctionne pour toutes les bases de données SQL?

Edit:

Si il n'y a pas (ce qui semble être le cas), quelqu'un peut-il suggérer un ensemble de requêtes SQL qui va travailler pour divers fournisseurs de bases de données? Mon intention serait de déterminer par programme une déclaration que je peut utiliser en fonction de mon fournisseur de base de données de configuration.

324voto

Rob Hruska Points 39151

Après un peu de recherche avec l'aide de quelques réponses ici:

SELECT 1

  • H2
  • MySQL
  • Microsoft SQL Server (selon NimChimpsky)
  • PostgreSQL
  • SQLite

SELECT 1 FROM DUAL

  • Oracle

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)

    Note: j'ai essayé à l'aide d'un WHERE 1=0 clause relative à la deuxième requête, mais il ne fonctionne pas comme une valeur de Apache Commons DBCP de l' validationQuery, car la requête ne renvoie aucune ligne


VALUES 1 ou SELECT 1 FROM SYSIBM.SYSDUMMY1

SELECT current date FROM sysibm.sysdummy1

  • DB2

select count(*) from systables

  • Informix

11voto

Mark Byers Points 318575

Malheureusement, il n'existe pas d'instruction SELECT qui fonctionnera indépendamment de la base de données.

La plupart des bases de données de soutien:

SELECT 1

Certaines bases de données ne prennent pas en charge, mais elles ont un tableau à DOUBLE que vous pouvez utiliser lorsque vous n'avez pas besoin d'une table:

SELECT 1 FROM DUAL

MySQL supporte aussi ce pour des raisons de compatibilité, mais pas toutes les bases de données ne. Une solution de contournement pour les bases de données qui ne prennent pas en charge soit de la ci-dessus est de créer un tableau à DOUBLE qui contient une seule ligne, puis le ci-dessus ne fonctionne.

HSQLDB prend en charge ni de ce qui précède, de sorte que vous pouvez créer de la DOUBLE table ou d'utiliser:

SELECT 1 FROM any_table_that_you_know_exists_in_your_database

2voto

Wojciechk Points 54

J’utilise celui-ci :

pour vérifier la connexion et la capacité d’exécuter des requêtes (avec 1 rang comme résultat) pour postgreSQL, MySQL et MSSQL.

1voto

nolan6000 Points 1511

En supposant que l'OP veut un Java réponse:

Comme de JDBC3 / Java 6, il y a la isValid() méthode qui devrait être utilisée plutôt que d'inventer sa propre méthode.

Le réalisateur du pilote est nécessaire pour exécuter une sorte de requête sur la base de données lors de cette id de la méthode appelée. Vous - comme un simple JDBC par l'utilisateur n'ont pas de connaître ou de comprendre ce que cette requête est. Tout ce que vous avez à faire est de faire confiance que le créateur du pilote JDBC a fait son travail correctement.

1voto

NimChimpsky Points 20263

``fonctionnerait dans sql server, pas sûr que les autres.

Norme ansi sql permet de créer une table et ensuite interroger de ce tableau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X