많은 데이터베이스 연결 풀링 라이브러리는 유휴 상태에 대한 SQL 연결을 테스트하는 기능을 제공합니다. 예를 들어, JDBC 풀링 라이브러리 c3p0 에는라는 속성이 있으며,이 속성 preferredTestQuery
은 구성된 간격으로 연결에서 실행됩니다. 마찬가지로 Apache Commons DBCP에는 validationQuery
.
내가 본 많은 예제 쿼리 는 MySQL에 SELECT 1;
대한 것이며 테스트 쿼리의 값으로 사용 하는 것이 좋습니다 . 그러나,이 쿼리는 일부 데이터베이스 (있는 예를 들어, HSQLDB, 작동하지 않습니다 SELECT 1
기대 FROM
절).
동등하지만 효율적이지만 모든 SQL 데이터베이스에서 작동하는 데이터베이스에 구애받지 않는 쿼리가 있습니까?
편집하다:
존재하지 않는 경우 (다른 경우에 해당되는 경우) 다양한 데이터베이스 공급자에 대해 작동하는 SQL 쿼리 세트를 제안 할 수 있습니까? 데이터베이스 프로 바이더 구성을 기반으로 사용할 수있는 명령문을 프로그래밍 방식으로 결정하려고합니다.
답변
여기에 대한 답변 중 일부의 도움과 함께 약간의 연구를 한 후에 :
SELECT 1
- H2
- MySQL
- Microsoft SQL Server ( NimChimpsky에 따름 )
- PostgreSQL
- SQLite
SELECT 1 FROM DUAL
- 신탁
SELECT 1 FROM any_existing_table WHERE 1=0
또는
SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS
-
HSQLDB (버전 1.8.0.10으로 테스트)
참고 :
WHERE 1=0
두 번째 쿼리에서 절을 사용하려고 시도했지만validationQuery
쿼리가 행을 반환하지 않기 때문에 Apache Commons DBCP의 값으로 작동 하지 않았습니다.
VALUES 1
또는 SELECT 1 FROM SYSIBM.SYSDUMMY1
- Apache Derby (대 시크 를 통해 )
SELECT 1 FROM SYSIBM.SYSDUMMY1
- DB2
select count(*) from systables
- 인포믹스
답변
드라이버가 JDBC 4 호환 인 경우 연결을 테스트하기 위해 전용 쿼리가 필요하지 않습니다. 대신 연결 을 테스트 할 Connection.isValid 가 있습니다.
JDBC 4는 2006 년부터 Java 6의 일부이며 드라이버는이를 지원해야합니다!
HikariCP와 같은 유명한 연결 풀에는 여전히 테스트 쿼리를 지정하기위한 구성 매개 변수가 있지만 사용하지 않는 것이 좋습니다.
TestconnectionTestQuery
드라이버가 JDBC4를 지원하는 경우이 속성을 설정하지 않는 것이 좋습니다. JDBC4 Connection.isValid () API를 지원하지 않는 “레거시”데이터베이스 용입니다. 데이터베이스에서 연결이 아직 활성 상태인지 확인하기 위해 풀에서 연결을 제공하기 직전에 실행되는 쿼리입니다. 이 속성없이 풀을 다시 실행하면 드라이버가 JDBC4 호환이 아닌 경우 HikariCP가 오류를 기록합니다. 기본값 : 없음
답변
불행히도 데이터베이스에 관계없이 항상 작동하는 SELECT 문은 없습니다.
대부분의 데이터베이스는 다음을 지원합니다.
SELECT 1
일부 데이터베이스는이를 지원하지 않지만 테이블이 필요 없을 때 사용할 수있는 DUAL이라는 테이블이 있습니다.
SELECT 1 FROM DUAL
MySQL은 호환성을 위해이를 지원하지만 모든 데이터베이스가 지원하는 것은 아닙니다. 위의 방법 중 하나를 지원하지 않는 데이터베이스에 대한 해결 방법은 단일 행을 포함하는 DUAL이라는 테이블을 작성하는 것입니다.
HSQLDB는 위의 어느 것도 지원하지 않으므로 DUAL 테이블을 작성하거나 다음을 사용할 수 있습니다.
SELECT 1 FROM any_table_that_you_know_exists_in_your_database
답변
나는 이것을 사용한다 :
select max(table_catalog) as x from information_schema.tables
postgreSQL, MySQL 및 MSSQL에 대한 연결 및 쿼리 실행 결과 (1 행)
답변
나는 사용한다
Select COUNT(*) As X From INFORMATION_SCHEMA.SYSTEM_USERS Where 1=0
hsqldb 1.8.0의 경우
답변
사용 테스트를 위해 select count(*)
, 그것은 사용에보다 효율적으로해야 select count(1)
하기 때문에 *
모든 컬럼 데이터를 읽을을 일으킬 수 있습니다.
답변
select 1
SQL 서버에서 작동하지만 다른 것에 대해서는 확실하지 않습니다.
표준 ansi sql을 사용하여 테이블을 만든 다음 해당 테이블에서 쿼리하십시오.