Ich habe eine H2-Datenbank mit URL "jdbc:h2:test"
. Ich erstelle eine Tabelle mit CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64));
. Ich wähle dann alles aus dieser (leeren) Tabelle mit SELECT * FROM PERSON
. So weit, ist es gut.
Wenn ich jedoch die URL in ändere "jdbc:h2:mem:test"
, besteht der einzige Unterschied darin, dass sich die Datenbank jetzt nur im Speicher befindet. Dies gibt mir eine org.h2.jdbc.JdbcSQLException: Table "PERSON" not found; SQL statement: SELECT * FROM PERSON [42102-154]
. Ich vermisse hier wahrscheinlich etwas Einfaches, aber jede Hilfe wäre dankbar.
Person
erneut erstellen . H2 weiß nichts über die Datenbank, die Sie zuvor auf der Festplatte erstellt haben.Antworten:
DB_CLOSE_DELAY=-1
hbm2ddl schließt die Verbindung nach dem Erstellen der Tabelle, sodass h2 sie verwirft.
Wenn Sie Ihre Verbindungs-URL so konfiguriert haben
Der Inhalt der Datenbank geht verloren, sobald die letzte Verbindung geschlossen wird.
Wenn Sie Ihren Inhalt behalten möchten, müssen Sie die URL wie folgt konfigurieren
In diesem Fall behält h2 seinen Inhalt so lange bei, wie der VM lebt.
Beachten Sie das Semikolon (
;
) anstelle von Doppelpunkt (:
).Weitere Informationen finden Sie im Abschnitt In-Memory-Datenbanken auf der Seite Funktionen . Zitieren:
quelle
jdbc:h2:mem:;DB_CLOSE_DELAY=-1
funktioniert nicht.Ich weiß, dass dies nicht Ihr Fall war, aber ich hatte das gleiche Problem, weil H2 die Tabellen mit UPPERCASE-Namen erstellte und sich dann zwischen Groß- und Kleinschreibung unterschied, obwohl ich in allen Skripten (einschließlich der Erstellungsskripte) Kleinbuchstaben verwendet habe.
Gelöst durch Hinzufügen
;DATABASE_TO_UPPER=false
zur Verbindungs-URL.quelle
DATABASE_TO_UPPER=false
Ding als SQL-Anweisung in einem Init-Skript festzulegen? (Ähnlich wie bei einer Anweisung wieSET MODE PostgreSQL;
) Wenn ja, wie lautet die genaue Syntax?Schwer zu erzählen. Ich habe ein Programm erstellt, um dies zu testen:
Der Test wurde ohne Fehler und ohne unerwartete Ausgabe abgeschlossen. Welche Version von h2 verwenden Sie?
quelle
Die speicherinterne H2-Datenbank speichert Daten im Speicher innerhalb der JVM. Beim Beenden der JVM gehen diese Daten verloren.
Ich vermute, dass das, was Sie tun, den beiden folgenden Java-Klassen ähnlich ist. Eine dieser Klassen erstellt eine Tabelle und die andere versucht, sie einzufügen:
und
Wenn ich diese Klassen nacheinander durchführte, erhielt ich die folgende Ausgabe:
Sobald der erste
java
Prozess beendet wird, existiert die von erstellte TabelleCreateTable
nicht mehr. Wenn also die InsertIntoTable-Klasse hinzukommt, gibt es keine Tabelle, in die sie eingefügt werden kann.Als ich die Verbindungszeichenfolgen in änderte,
jdbc:h2:test
stellte ich fest, dass es keinen solchen Fehler gab. Ich fand auch, dass eine Dateitest.h2.db
erschienen war. Hier hatte H2 die Tabelle abgelegt, und da sie auf der Festplatte gespeichert war, war die Tabelle immer noch für die InsertIntoTable-Klasse verfügbar.quelle
registerDriver()
Aufruf nicht erforderlich ist: Erstens: Eine einfache Class.forName () macht dasselbe für die meisten JDBC-Treiber und (was noch wichtiger ist) ist für Java 6 und höher völlig unnötig, wodurch (kompatible) JDBC-Treiber auf dem automatisch erkannt werden Klassenpfad.Ich habe versucht hinzuzufügen
Das hat jedoch nicht geholfen. Auf der H2-Site habe ich Folgendes gefunden, was in einigen Fällen tatsächlich helfen könnte.
Allerdings war mein Problem , dass nur das Schema als Standard ein , anders sein sollte. Also sofort benutzt
Ich musste verwenden:
Dann waren die Tabellen sichtbar
quelle
Ich hatte das gleiche Problem und änderte meine Konfiguration in application-test.properties wie folgt:
Und meine Abhängigkeiten:
Und die Anmerkungen zur Testklasse:
quelle
Ich habe versucht, Tabellen-Metadaten abzurufen, hatte jedoch den folgenden Fehler:
Verwenden von:
hat ein leeres ResultSet zurückgegeben.
Aber stattdessen hat es mit der folgenden URL richtig funktioniert:
Es musste angegeben werden: DATABASE_TO_UPPER = false
quelle
Beim Öffnen der h2-Konsole muss die JDBC-URL mit der in den Eigenschaften angegebenen übereinstimmen:
Was offensichtlich erscheint, aber ich habe Stunden damit verbracht, dies herauszufinden.
quelle
Gelöst durch Erstellen eines neuen Ordners src / test / resources + Einfügen der Datei application.properties, wobei explizit angegeben wird, dass eine Testdatenbank erstellt werden soll:
quelle
Ich bin zu diesem Beitrag gekommen, weil ich den gleichen Fehler hatte.
In meinem Fall wurden die Datenbankentwicklungen nicht ausgeführt, sodass die Tabelle überhaupt nicht vorhanden war.
Mein Problem war, dass die Ordnerstruktur für die Evolutionsskripte falsch war.
von: https://www.playframework.com/documentation/2.0/Evolutions
Ich hatte einen Ordner namens conf / evolutions.default von Eclipse erstellt. Das Problem verschwand, nachdem ich die Ordnerstruktur auf conf / evolutions / default korrigiert hatte
quelle
quelle
Hatte genau das gleiche Problem, versuchte alle oben genannten, aber ohne Erfolg. Die ziemlich lustige Ursache des Fehlers war, dass die JVM zu schnell gestartet wurde, bevor die DB-Tabelle erstellt wurde (unter Verwendung einer data.sql-Datei in src.main.resources). Also habe ich einen Thread.sleep (1000) -Timer eingestellt, der nur eine Sekunde wartet, bevor ich "select * from person" aufrufe. Jetzt einwandfrei arbeiten.
application.properties:
data.sql:
PersonJdbcDAO.java:
Hauptklasse:
quelle
Ich fand es funktionierend, nachdem ich die Abhängigkeit von Spring Data JPA von Spring Boot Version 2.2.6 hinzugefügt hatte. RELEASE -
Hinzufügen der H2 DB-Konfiguration in application.yml -
quelle
Ich fand die Lösung durch Hinzufügen dieser Konfiguration:
Die vollständige Konfiguration (mit einfacher spring.datasource.url):
Ich arbeite mit h2 Version 1.4.200 und Spring-Boot 2.2.6.RELEASE
quelle
Time.sleep (1000);
Das ist Arbeit für mich. Nur zum Ausprobieren: Wenn Ihr PC langsam ist, können Sie die Zeitdauer des Threads erhöhen, damit die Datenbank einwandfrei funktioniert und JVM unsere Tabelle abrufen kann.
quelle