Многие библиотеки пулов соединений с базами данных предоставляют возможность проверить свои соединения SQL на бездействие. Например, у библиотеки пулов JDBC c3p0 есть свойство под названием preferredTestQuery
, которое выполняется в соединении через заданные интервалы. Аналогично, у Apache Commons DBCP есть validationQuery
.
Многие примеры запросов, которые я видел, предназначены для MySQL и рекомендуют использовать SELECT 1;
в качестве значения для тестового запроса. Однако этот запрос не работает в некоторых базах данных (например, HSQLDB, для которого SELECT 1
ожидается FROM
предложение).
Существует ли независимый от базы данных запрос, который эквивалентно эффективен, но будет работать для всех баз данных SQL?
Редактировать:
Если нет (что, кажется, имеет место), может ли кто-нибудь предложить набор SQL-запросов, которые будут работать для различных поставщиков баз данных? Мое намерение состояло бы в том, чтобы программно определить оператор, который я могу использовать, основываясь на конфигурации моего поставщика базы данных.
источник
Ответы:
После небольшого исследования вместе с помощью некоторых ответов здесь:
SELECT 1
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
предложение для второго запроса, но он не работал как значение для DBCP Apache CommonsvalidationQuery
, так как запрос не возвращает никаких строкVALUES 1
илиSELECT 1 FROM SYSIBM.SYSDUMMY1
SELECT 1 FROM SYSIBM.SYSDUMMY1
select count(*) from systables
источник
VALUES 1
иSELECT 1 FROM SYSIBM.SYSDUMMY1
для Apache DerbyЕсли ваш драйвер совместим с JDBC 4, то для проверки соединений нет необходимости в специальном запросе. Вместо этого есть Connection.isValid для проверки соединения.
JDBC 4 является частью Java 6 с 2006 года, и ваш драйвер должен уже поддерживать это!
Известные пулы соединений, такие как HikariCP, все еще имеют параметр config для указания тестового запроса, но настоятельно не рекомендуют его использовать:
источник
К сожалению, нет оператора SELECT, который всегда будет работать независимо от базы данных.
Большинство баз данных поддерживают:
Некоторые базы данных не поддерживают это, но имеют таблицу с именем DUAL, которую вы можете использовать, когда вам не нужна таблица:
MySQL также поддерживает это по причинам совместимости, но не все базы данных поддерживают. Обходной путь для баз данных, которые не поддерживают ни один из вышеперечисленных, заключается в создании таблицы с именем DUAL, содержащей одну строку, тогда вышеприведенное будет работать.
HSQLDB не поддерживает ничего из вышеперечисленного, поэтому вы можете либо создать таблицу DUAL, либо использовать:
источник
SELECT 1 FROM DUAL
также не работает с HSQLDB.Я использую это:
проверить соединение и возможность выполнения запросов (в результате 1 строка) для postgreSQL, MySQL и MSSQL.
источник
я использую
для hsqldb 1.8.0
источник
Для использования тестов
select count(*)
, он должен быть более эффективным,select count(1)
поскольку*
может заставить его читать все данные столбца.источник
select 1
будет работать в SQL Server, не уверен в других.Используйте стандартный ANSI SQL, чтобы создать таблицу, а затем запросить из этой таблицы.
источник
create table
?Предполагая, что ОП хочет ответ Java:
Начиная с JDBC3 / Java 6 есть метод isValid (), который следует использовать, а не изобретать собственный метод.
Разработчик драйвера должен выполнить какой-то запрос к базе данных при вызове этого метода с идентификатором. Вы - как простой пользователь JDBC - не должны знать или понимать, что это за запрос. Все, что вам нужно сделать, это поверить, что создатель драйвера JDBC выполнил свою работу должным образом.
источник
Как насчет
Я использую это раньше. MySQL, H2 в порядке, я не знаю других.
источник
Просто выяснил трудный путь, что это
и для MaxDB.
источник
Для Oracle высокопроизводительный запрос будет
Это с точки зрения производительности.
источник
Я использую это для Firebird
источник
Для MSSQL .
Это помогло мне определить, живы ли связанные серверы. Использование соединения Open Query и TRY CATCH, чтобы поместить результаты ошибки в нечто полезное.
docs.microsoft.com
источник