Mam bazę danych H2 z adresem URL "jdbc:h2:test"
. Tworzę tabelę za pomocą CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64));
. Następnie wybieram wszystko z tej (pustej) tabeli za pomocą SELECT * FROM PERSON
. Na razie w porządku.
Jeśli jednak zmienię adres URL "jdbc:h2:mem:test"
, jedyną różnicą jest to, że baza danych jest teraz tylko w pamięci, to daje mi org.h2.jdbc.JdbcSQLException: Table "PERSON" not found; SQL statement: SELECT * FROM PERSON [42102-154]
. Prawdopodobnie brakuje mi tutaj czegoś prostego, ale każda pomoc byłaby mile widziana.
Person
ponownie utworzyć tabelę . H2 nie wie nic wcześniej o bazie danych utworzonej na dysku.Odpowiedzi:
DB_CLOSE_DELAY=-1
hbm2ddl zamyka połączenie po utworzeniu tabeli, więc h2 je odrzuca.
Jeśli masz skonfigurowany adres URL połączenia w ten sposób
zawartość bazy danych jest tracona w momencie zamknięcia ostatniego połączenia.
Jeśli chcesz zachować zawartość, musisz skonfigurować adres URL w ten sposób
Jeśli to zrobisz, h2 zachowa swoją zawartość tak długo, jak żyje VM .
Zwróć uwagę na średnik (
;
) zamiast dwukropka (:
).Zobacz sekcję Bazy danych w pamięci na stronie Funkcje . Cytować:
źródło
jdbc:h2:mem:;DB_CLOSE_DELAY=-1
Nie działa.Wiem, że to nie był twój przypadek, ale miałem ten sam problem, ponieważ H2 tworzył tabele z nazwami WIELKIE LITERY, a następnie zachowywał rozróżnianie wielkości liter, mimo że we wszystkich skryptach (także tych tworzących) użyłem małych liter.
Rozwiązany przez dodanie
;DATABASE_TO_UPPER=false
do adresu URL połączenia.źródło
DATABASE_TO_UPPER=false
funkcję jako instrukcję SQL w skrypcie inicjującym? (Podobnie jak w przypadku instrukcjiSET MODE PostgreSQL;
). Jeśli tak, jaka jest dokładna składnia?Ciężko powiedzieć. Stworzyłem program do testowania tego:
Test został zakończony bez żadnych awarii i nieoczekiwanych wyników. Którą wersję h2 używasz?
źródło
Baza danych H2 w pamięci przechowuje dane w pamięci w JVM. Gdy JVM kończy pracę, dane te są tracone.
Podejrzewam, że to, co robisz, jest podobne do dwóch poniższych klas Java. Jedna z tych klas tworzy tabelę, a druga próbuje wstawić do niej:
i
Kiedy prowadziłem te klasy jedna po drugiej, otrzymałem następujące dane wyjściowe:
Gdy tylko pierwszy
java
proces zakończy się, utworzona przezCreateTable
nie tabela już nie istnieje. Kiedy pojawia się klasa InsertIntoTable, nie ma w niej tabeli do wstawienia.Kiedy zmieniłem parametry połączenia na
jdbc:h2:test
, okazało się, że nie było takiego błędu. Odkryłem również, żetest.h2.db
pojawił się plik . W tym miejscu H2 umieścił tabelę, a ponieważ przechowywano ją na dysku, tabela wciąż tam była do znalezienia dla klasy InsertIntoTable.źródło
registerDriver()
wywołanie nie jest konieczne: po pierwsze: prosty Class.forName () robi to samo dla większości sterowników JDBC i (co ważniejsze) jest zupełnie niepotrzebny dla Java 6 und up, który automatycznie wykrywa (kompatybilny) sterowniki JDBC na ścieżka klasy.Próbowałem dodać
To jednak nie pomogło. Na stronie H2 znalazłem następujące, które rzeczywiście mogą pomóc w niektórych przypadkach.
Jednak moim problemem było to, że tylko schemat powinien być inny niż domyślny. Tak instynkt użycia
Musiałem użyć:
Wtedy stoły były widoczne
źródło
Miałem ten sam problem i zmieniłem konfigurację w application-test.properties na to:
I moje zależności:
A adnotacje użyte w klasie testowej:
źródło
Próbowałem pobrać metadane tabeli, ale wystąpił następujący błąd:
Za pomocą:
zwrócił pusty zestaw wyników.
Ale użycie następującego adresu URL działało poprawnie:
Konieczne było określenie: DATABASE_TO_UPPER = false
źródło
Podczas otwierania konsoli h2 adres URL JDBC musi być zgodny z adresem określonym we właściwościach:
Co wydaje się oczywiste, ale spędziłem godziny, zastanawiając się nad tym.
źródło
Rozwiązany przez utworzenie nowego folderu src / test / resources + wstawienie pliku application.properties, wyraźnie określając, aby utworzyć testową bazę danych:
źródło
Przyszedłem do tego postu, ponieważ miałem ten sam błąd.
W moim przypadku ewolucje bazy danych nie zostały wykonane, więc tabeli w ogóle nie było.
Mój problem polegał na tym, że struktura folderów dla skryptów ewolucji była nieprawidłowa.
od: https://www.playframework.com/documentation/2.0/Evolutions
Miałem folder o nazwie conf / evolutions.default utworzony przez eclipse. Problem zniknął po poprawieniu struktury folderów na conf / evolutions / default
źródło
źródło
Miałem dokładnie ten sam problem, wypróbowałem wszystkie powyższe, ale bez powodzenia. Dość zabawną przyczyną błędu było to, że JVM uruchomił się zbyt szybko, zanim utworzono tabelę DB (przy użyciu pliku data.sql w pliku src.main.resources). Dlatego ustawiłem licznik Thread.sleep (1000), aby poczekał tylko sekundę przed wywołaniem „select * from person”. Teraz działa bez zarzutu.
application.properties:
data.sql:
PersonJdbcDAO.java:
główna klasa:
źródło
Odkryłem, że działa po dodaniu zależności Spring Data JPA od wersji Spring boot 2.2.6.
Dodaj konfigurację H2 DB w application.yml -
źródło
Znalazłem rozwiązanie, dodając tę konfigurację:
Pełna konfiguracja (z prostym spring.datasource.url):
Pracuję z wersją h2 1.4.200 i Spring-Boot 2.2.6
źródło
Time.sleep (1000);
To dla mnie praca. Tylko na próbę, jeśli twój komputer jest wolny, możesz wydłużyć czas trwania wątku, aby DB działał dobrze, a JVM mógł uzyskać naszą tabelę.
źródło