Wiele bibliotek puli połączeń bazy danych umożliwia testowanie połączeń SQL pod kątem bezczynności. Na przykład biblioteka c3p0 buforująca JDBC ma właściwość o nazwie preferredTestQuery
, która jest wykonywana w połączeniu w skonfigurowanych odstępach czasu. Podobnie Apache Commons DBCP ma validationQuery
.
Wiele przykładowych zapytań , które widziałem, dotyczy MySQL i zalecamy użycie ich SELECT 1;
jako wartości dla zapytania testowego. Jednak to zapytanie nie działa na niektórych bazach danych (np. HSQLDB, dla których SELECT 1
oczekuje FROM
klauzuli).
Czy istnieje zapytanie niezależne od bazy danych, które jest równie wydajne, ale będzie działać dla wszystkich baz danych SQL?
Edytować:
Jeśli nie ma (co wydaje się mieć miejsce), czy ktoś może zasugerować zestaw zapytań SQL, które będą działać dla różnych dostawców baz danych? Moim zamiarem byłoby programowe określenie instrukcji, której mogę użyć, na podstawie konfiguracji mojego dostawcy bazy danych.
źródło
Odpowiedzi:
Po krótkich badaniach i pomocy z niektórymi odpowiedziami tutaj:
SELECT 1
SELECT 1 FROM DUAL
SELECT 1 FROM any_existing_table WHERE 1=0
lub
SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS
HSQLDB (testowane z wersją 1.8.0.10)
Uwaga: próbowałem użyć
WHERE 1=0
klauzuli w drugim zapytaniu, ale nie działało to jako wartość dla DBCP Apache CommonsvalidationQuery
, ponieważ zapytanie nie zwraca żadnych wierszyVALUES 1
lubSELECT 1 FROM SYSIBM.SYSDUMMY1
SELECT 1 FROM SYSIBM.SYSDUMMY1
select count(*) from systables
źródło
VALUES 1
iSELECT 1 FROM SYSIBM.SYSDUMMY1
dla Apache DerbyJeśli Twój sterownik jest zgodny z JDBC 4, nie ma potrzeby wysyłania dedykowanego zapytania w celu przetestowania połączeń. Zamiast tego istnieje Connection.isValid do testowania połączenia.
JDBC 4 jest częścią Java 6 od 2006 roku i Twój sterownik powinien już to obsługiwać!
Słynne pule połączeń, takie jak HikariCP, nadal mają parametr konfiguracyjny do określania zapytania testowego, ale zdecydowanie odradzamy jego używanie:
źródło
Niestety nie ma instrukcji SELECT, która zawsze będzie działać niezależnie od bazy danych.
Większość baz danych obsługuje:
Niektóre bazy danych tego nie obsługują, ale mają tabelę o nazwie DUAL, której możesz użyć, gdy nie potrzebujesz tabeli:
MySQL również to obsługuje ze względu na kompatybilność, ale nie wszystkie bazy danych tak. Obejściem dla baz danych, które nie obsługują żadnego z powyższych, jest utworzenie tabeli o nazwie DUAL, która zawiera pojedynczy wiersz, wtedy powyższe będzie działać.
HSQLDB nie obsługuje żadnego z powyższych, więc możesz utworzyć tabelę DUAL lub użyć:
źródło
SELECT 1 FROM DUAL
również nie działa z HSQLDB.Używam tego:
aby sprawdzić połączenie i możliwość uruchamiania zapytań (z wynikiem 1 wiersza) dla postgreSQL, MySQL i MSSQL.
źródło
używam
dla hsqldb 1.8.0
źródło
W przypadku testów używających
select count(*)
powinno być bardziej wydajne,select count(1)
ponieważ*
może spowodować odczytanie wszystkich danych z kolumny.źródło
select 1
działałby na serwerze sql, nie mając pewności co do innych.Użyj standardowego ansi sql, aby utworzyć tabelę, a następnie wykonać zapytanie z tej tabeli.
źródło
create table
?Zakładając, że OP chce odpowiedzi Java:
Od JDBC3 / Java 6 istnieje metoda isValid () , której należy używać zamiast wymyślać własną metodę.
Implementator sterownika jest zobowiązany do wykonania pewnego rodzaju zapytania w bazie danych, gdy wywoływana jest ta metoda. Ty - jako zwykły użytkownik JDBC - nie musisz wiedzieć ani rozumieć, czym jest to zapytanie. Wszystko, co musisz zrobić, to zaufać, że twórca sterownika JDBC wykonał swoją pracę poprawnie.
źródło
Co powiesz na
Używam tego wcześniej, MySQL, H2 jest OK, innych nie znam.
źródło
Właśnie się o tym przekonałem
również dla MaxDB.
źródło
W przypadku Oracle wysokowydajnym zapytaniem będzie
To jest z perspektywy wydajności.
źródło
Używam tego dla Firebird
źródło
W przypadku MSSQL .
Pomogło mi to ustalić, czy połączone serwery działają. Używanie połączenia Open Query i TRY CATCH, aby przypisać wyniki błędu do czegoś użytecznego.
docs.microsoft.com
źródło