1. ホーム
  2. sql

[解決済み] すべての(またはほとんどの)データベースで動作する効率的なSQLテストクエリまたは検証クエリ

2022-03-06 03:57:15

質問内容

多くのデータベース接続プーリングライブラリは、SQL接続がアイドルであるかどうかをテストする機能を提供しています。例えば、JDBCプーリングライブラリの場合 c3p0 というプロパティがあります。 preferredTestQuery これは、設定された間隔で接続時に実行されます。同様に、Apache Commons DBCP には validationQuery .

多くの クエリ はMySQL用で、これを使うことを推奨しています。 SELECT 1; をテストクエリの値として使用します。しかし、このクエリはいくつかのデータベースでは動作しません(たとえば、HSQLDBでは SELECT 1FROM 節を含む)。

同等の効率を持ちながら、すべてのSQLデータベースで動作するデータベース非依存型のクエリはありますか?

編集する

もしそうでない場合(そうであるように見える)、誰か様々なデータベースプロバイダに対応する一連のSQLクエリを提案してくれませんか?私の意図は、データベースプロバイダの構成に基づいて使用できるステートメントをプログラム的に決定することです。

どのように解決するのですか?

その jOOQマニュアルの DUAL テーブル には、jOOQの select(inline(1)) クエリで使用されます。

-- Access
SELECT 1 FROM (SELECT count(*) dual FROM MSysResources) AS dual

-- BigQuery, CockroachDB, Exasol, H2, Ignite, MariaDB, MySQL, PostgreSQL, 
-- Redshift, Snowflake, SQLite, SQL Server, Sybase ASE, Vertica
SELECT 1

-- MemSQL, Oracle
SELECT 1 FROM DUAL

-- CUBRID
SELECT 1 FROM db_root

-- Db2
SELECT 1 FROM SYSIBM.DUAL

-- Derby
SELECT 1 FROM SYSIBM.SYSDUMMY1

-- Firebird
SELECT 1 FROM RDB$DATABASE

-- HANA, Sybase SQL Anywhere
SELECT 1 FROM SYS.DUMMY

-- HSQLDB
SELECT 1 FROM (VALUES(1)) AS dual(dual)

-- Informix
SELECT 1 FROM (SELECT 1 AS dual FROM systables WHERE (tabid = 1)) AS dual

-- Ingres, Teradata
SELECT 1 FROM (SELECT 1 AS "dual") AS "dual"