Eu tenho um banco de dados H2 com URL "jdbc:h2:test"
. Eu crio uma tabela usando CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64));
. Em seguida, seleciono tudo dessa tabela (vazia) usando SELECT * FROM PERSON
. Por enquanto, tudo bem.
No entanto, se eu alterar o URL para "jdbc:h2:mem:test"
, a única diferença é que o banco de dados agora está apenas na memória, isso me dá uma org.h2.jdbc.JdbcSQLException: Table "PERSON" not found; SQL statement: SELECT * FROM PERSON [42102-154]
. Provavelmente estou perdendo algo simples aqui, mas qualquer ajuda seria apreciada.
Person
novamente. H2 não sabe nada sobre o banco de dados que você criou no disco antes.Respostas:
DB_CLOSE_DELAY=-1
O hbm2ddl fecha a conexão depois de criar a tabela; portanto, a h2 a descarta.
Se você tiver seu URL de conexão configurado assim
o conteúdo do banco de dados é perdido no momento em que a última conexão é fechada.
Se você deseja manter seu conteúdo, precisa configurar o URL como este
Se fizer isso, a h2 manterá seu conteúdo enquanto a vm permanecer.
Observe o ponto-e-vírgula (
;
) em vez de dois-pontos (:
).Consulte a seção Bancos de dados na memória da página Recursos . Citar:
fonte
jdbc:h2:mem:;DB_CLOSE_DELAY=-1
, não funciona.Eu sei que esse não foi o seu caso, mas tive o mesmo problema, porque o H2 estava criando as tabelas com nomes MAIÚSCULAS e, então, fazia distinção entre maiúsculas e minúsculas, mesmo que em todos os scripts (inclusive nos de criação) eu usasse letras minúsculas.
Resolvido adicionando
;DATABASE_TO_UPPER=false
ao URL de conexão.fonte
DATABASE_TO_UPPER=false
como uma instrução SQL em um script init? (Da mesma forma que uma declaração comoSET MODE PostgreSQL;
) Em caso afirmativo, qual é a sintaxe exata?Difícil de dizer. Eu criei um programa para testar isso:
O teste foi concluído, sem falhas e sem saída inesperada. Qual versão do h2 você está executando?
fonte
O banco de dados na memória H2 armazena dados na memória dentro da JVM. Quando a JVM sai, esses dados são perdidos.
Eu suspeito que o que você está fazendo é semelhante às duas classes Java abaixo. Uma dessas classes cria uma tabela e a outra tenta inserir nela:
e
Quando executei essas classes uma após a outra, obtive a seguinte saída:
Assim que o primeiro
java
processo termina, a tabela criada porCreateTable
não existe mais. Portanto, quando a classe InsertIntoTable aparecer, não haverá tabela para inserir.Quando alterei as cadeias de conexão para
jdbc:h2:test
, descobri que não havia esse erro. Também descobri que um arquivotest.h2.db
havia aparecido. Foi aqui que H2 colocou a tabela e, como ela foi armazenada em disco, a tabela ainda estava lá para a classe InsertIntoTable encontrar.fonte
registerDriver()
chamada é desnecessária: Primeiro: um simples Class.forName () faz o mesmo para a maioria dos drivers JDBC e (mais importante) é completamente desnecessário para o Java 6 und up, que detecta automaticamente drivers JDBC (compatíveis) no caminho de classe.Eu tentei adicionar
No entanto, isso não ajudou. No site H2 , descobri o seguinte, o que de fato poderia ajudar em alguns casos.
No entanto , meu problema era que apenas o esquema deveria ser diferente do padrão. Tão instado de usar
Eu tive que usar:
Então as mesas estavam visíveis
fonte
Eu tive o mesmo problema e alterei minha configuração em application-test.properties para isso:
E minhas dependências:
E as anotações usadas na classe de teste:
fonte
Eu estava tentando buscar metadados da tabela, mas tive o seguinte erro:
Usando:
retornou um ResultSet vazio.
Mas, usando o seguinte URL, ele funcionou corretamente:
Havia uma necessidade de especificar: DATABASE_TO_UPPER = false
fonte
Ao abrir o console h2, a URL JDBC deve corresponder à especificada nas propriedades:
O que parece óbvio, mas passei horas descobrindo isso.
fonte
Resolvido criando uma nova pasta src / test / resources + insira o arquivo application.properties, especificando explicitamente para criar um dbase de teste:
fonte
Eu vim para este post porque tinha o mesmo erro.
No meu caso, as evoluções do banco de dados não foram executadas; portanto, a tabela não estava lá.
Meu problema era que a estrutura de pastas dos scripts de evolução estava errada.
from: https://www.playframework.com/documentation/2.0/Evolutions
Eu tinha uma pasta chamada conf / evolutions.default criada pelo eclipse. O problema desapareceu depois que eu corrigi a estrutura da pasta para conf / evolutions / default
fonte
fonte
Teve exatamente o mesmo problema, tentei todas as opções acima, mas sem sucesso. A causa mais engraçada do erro foi que a JVM foi iniciada muito rapidamente, antes da criação da tabela DB (usando um arquivo data.sql em src.main.resources). Então, eu coloquei um timer Thread.sleep (1000) para aguardar apenas um segundo antes de chamar "select * from person". Trabalhando perfeitamente agora.
application.properties:
data.sql:
PersonJdbcDAO.java:
classe principal:
fonte
Eu o encontrei funcionando depois de adicionar a dependência do Spring Data JPA na versão de inicialização 2.2.2 do Spring.
Adicione a configuração do H2 DB no application.yml -
fonte
Encontrei a solução adicionando esta configuração:
A configuração completa (com simple spring.datasource.url):
Estou trabalhando com a versão h2 1.4.200 e o Spring-Boot 2.2.6.
fonte
Time.sleep (1000);
Isso é trabalho para mim. Apenas para tentar, se o seu PC estiver lento, você poderá aumentar o tempo de duração do encadeamento para que o DB funcione bem e a JVM possa obter nossa tabela.
fonte