Muitas bibliotecas de pool de conexões de banco de dados fornecem a capacidade de testar suas conexões SQL quanto à ociosidade. Por exemplo, a biblioteca de pool JDBC c3p0 possui uma propriedade chamada preferredTestQuery
, que é executada na conexão em intervalos configurados. Da mesma forma, o Apache Commons DBCP possui validationQuery
.
Muitos exemplos de consultas que eu vi são para o MySQL e recomendo usar SELECT 1;
como valor para a consulta de teste. No entanto, essa consulta não funciona em alguns bancos de dados (por exemplo, HSQLDB, para o qual SELECT 1
espera uma FROM
cláusula).
Existe uma consulta independente de banco de dados que seja equivalente eficiente, mas funcionará para todos os bancos de dados SQL?
Editar:
Se não houver (o que parece ser o caso), alguém pode sugerir um conjunto de consultas SQL que funcionem para vários provedores de banco de dados? Minha intenção seria determinar programaticamente uma instrução que eu possa usar com base na configuração do meu provedor de banco de dados.
fonte
Respostas:
Após um pouco de pesquisa, juntamente com a ajuda de algumas das respostas aqui:
SELECT 1
SELECT 1 FROM DUAL
SELECT 1 FROM any_existing_table WHERE 1=0
ou
SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS
HSQLDB (testado com a versão 1.8.0.10)
Nota: Tentei usar uma
WHERE 1=0
cláusula na segunda consulta, mas ela não funcionou como um valor para os DBCP do Apache CommonsvalidationQuery
, pois a consulta não retorna nenhuma linhaVALUES 1
ouSELECT 1 FROM SYSIBM.SYSDUMMY1
SELECT 1 FROM SYSIBM.SYSDUMMY1
select count(*) from systables
fonte
VALUES 1
eSELECT 1 FROM SYSIBM.SYSDUMMY1
para o Apache DerbySe o seu driver for compatível com JDBC 4, não há necessidade de uma consulta dedicada para testar as conexões. Em vez disso, há Connection.isValid para testar a conexão.
O JDBC 4 faz parte do Java 6 de 2006 e seu driver deve suportar isso agora!
Pools de conexão famosos, como o HikariCP, ainda têm um parâmetro de configuração para especificar uma consulta de teste, mas desencorajam fortemente a usá-la:
fonte
Infelizmente, não há nenhuma instrução SELECT que funcione sempre, independentemente do banco de dados.
A maioria dos bancos de dados suporta:
Alguns bancos de dados não suportam isso, mas possuem uma tabela chamada DUAL que você pode usar quando não precisar de uma tabela:
O MySQL também suporta isso por razões de compatibilidade, mas nem todos os bancos de dados suportam. Uma solução alternativa para bancos de dados que não suportam nenhuma das opções acima é criar uma tabela chamada DUAL que contenha uma única linha, e as opções acima funcionarão.
O HSQLDB não suporta nenhum dos itens acima, portanto você pode criar a tabela DUAL ou usar:
fonte
SELECT 1 FROM DUAL
também não funciona com HSQLDB.Eu uso este:
para verificar a conexão e a capacidade de executar consultas (com 1 linha como resultado) para postgreSQL, MySQL e MSSQL.
fonte
eu uso
para hsqldb 1.8.0
fonte
Para testes de uso
select count(*)
, deve ser mais eficiente,select count(1)
pois*
pode fazer com que ele leia todos os dados da coluna.fonte
select 1
funcionaria no servidor sql, não tenho certeza sobre os outros.Use o ansi sql padrão para criar uma tabela e, em seguida, consulte a partir dessa tabela.
fonte
create table
?Supondo que o OP queira uma resposta Java:
A partir do JDBC3 / Java 6, existe o método isValid () que deve ser usado em vez de inventar o próprio método.
O implementador do driver é necessário para executar algum tipo de consulta no banco de dados quando esse ID de método é chamado. Você - como um mero usuário do JDBC - não precisa saber ou entender o que é essa consulta. Tudo o que você precisa fazer é confiar que o criador do driver JDBC fez seu trabalho corretamente.
fonte
E se
Eu uso isso antes. MySQL, H2 está OK, não conheço outros.
fonte
Acabei de descobrir da maneira mais difícil que é
para MaxDB também.
fonte
Para Oracle, a consulta de alto desempenho será
Isso é da perspectiva de desempenho.
fonte
Eu uso isso para o Firebird
fonte
Para MSSQL .
Isso me ajudou a determinar se os servidores vinculados estavam ativos. Usando uma conexão Open Query e um TRY CATCH para colocar os resultados do erro em algo útil.
docs.microsoft.com
fonte