Pergunta

Estou usando o Derby como um banco de dados incorporado. Além disso, estou usando sua opção de banco de dados na memória para meus testes de unidade.

O que não consigo descobrir é como desligar corretamente (Uma rápida olhada no código) o banco de dados Derby. Eu acredito que tenho funcionando para um banco de dados padrão, mas estou obtendo exceções diferentes quando a tentativa de código semelhante em um banco de dados na memória.

Vou omitir detalhes, eu os adicionarei se outros sentidos forem necessários.

Basicamente, estou tentando desligar meu banco de dados nessas duas modas, onde meu banco de dados na memória é constantemente chamado de "eh":

DriverManager.getConnection("jdbc:derby:memory:eh;shutdown=true");

então:

DriverManager.getConnection("jdbc:derby:eh;shutdown=true");

O primeiro resulta em uma exceção, mas não a que se espera. Os detalhes são:

java.sql.sqlnontransientConnectionException: banco de dados 'memória: eh' desligamento.

O último resulta em

java.SQL.SQLEXCECTION: DATABASE 'EH' não encontrado.

Com base no que consegui descobrir, queremos um SQLException Mas não o que recebemos. Por outro lado, o SQLNonTransientConnectionException O erro parece mais apropriado, mas não é o tipo certo (embora seja derivado de SQLException) Nem possui o código de estado certo. O código do estado acaba sendo: 08006.

O código de exemplo que eu ilustra que um SQLException com um estado SQL de "XJ015".

NOTA: O exemplo que estou mencionando é: Programa Wwdembedded (Código Java).

Foi útil?

Solução

XJ015 (com SQLCODE 50000) é o esperado (bem -sucedido) SQLSTATE Para desligamento completo do sistema. 08006 (com SQLCODE 45000), por outro lado, é o esperado SQLSTATE Para desligamento de apenas um banco de dados individual.

DriverManager.getConnection("jdbc:derby:;shutdown=true");

Fecha todo o sistema e deve resultar em XJ015.

Outras dicas

O URL "JDBC: Derby: Memória: EH; Shutdown = true" resulta no código de erro 08006 esperado, mas na verdade não remove o banco de dados da memória. Se posteriormente, você tenta criar um novo banco de dados com "JDBC: Derby: Memory: eh; Create = true", você receberá um erro dizendo que o banco de dados já existe.

Felizmente, a partir de Derby 10.6.1.0 (lançado em 17 de maio de 2010), é possível descartar um banco de dados de memória usando um URL do formulário "JDBC: Derby: Memory: Eh; Drop = True". Veja o Notas de liberação e a página Usando bancos de dados na memória.

Eu acredito que seu primeiro exemplo de código está bem. A diferença de estado do SQL que você está vendo, acredito, é porque você está executando o Derby incorporado, mas o código de exemplo que você viu (com o SQL State XJ015) estava em execução em uma configuração de cliente-servidor.

Como você observou, a SQLNOntransientConnectionException é uma subclasse da SQLEXCECTION, por isso estou confuso sobre o motivo pelo qual você acha que não está obtendo o tipo certo de exceção.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top