Spring Boot Standard H2 JDBC-Verbindung (und H2-Konsole)

107

Ich versuche einfach, den Inhalt der H2-Datenbank für eine eingebettete H2-Datenbank anzuzeigen, die Spring-Boot erstellt, wenn ich in meiner application.properties nichts angebe und mit mvn spring: run beginne. Ich kann sehen, wie JPA im Ruhezustand die Tabellen erstellt, aber wenn ich versuche, auf die h2-Konsole unter der URL unter der Datenbank zuzugreifen, sind keine Tabellen vorhanden.

http://localhost:8080/console/

Ich sehe Vorschläge wie diesen: Anzeigen des Inhalts der eingebetteten H2-Datenbank, die von Spring gestartet wurde

Aber ich weiß nicht, wo ich das vorgeschlagene XML im Spring-Boot ablegen soll, und selbst wenn, möchte ich nicht, dass die h2console mehr verfügbar ist, wenn eine externe Datenbank konfiguriert ist, sodass es wahrscheinlicher ist, dass ich damit umgehen muss mit einer Art bedingtem Code (oder lassen Sie einfach zu, dass der Frühling automatisch damit umgeht, im idealsten Fall, wenn ich H2 nur einbinde, wenn ein Maven-Profil aktiviert ist).

Hat jemand einen Beispielcode, der zeigt, wie die H2-Konsole beim Booten funktioniert (und wie man herausfindet, welche JDBC-Verbindungszeichenfolge Spring verwendet)?

Aaron Zeckoski
quelle
Ich kann meine eigene Frage teilweise beantworten, indem ich sie zu meinen application.properties hinzufüge: spring.datasource.url = jdbc: h2: mem: AZ; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE spring.datasource.driverClassName = org.h2.Driver spring .datasource.username = sa spring.datasource.password = Aber ich möchte wirklich wissen, wie man die Konfiguration programmgesteuert verwaltet (oder zumindest die Frühlingsstandards herausfindet)
Aaron Zeckoski
Schauen Sie sich diesen stackoverflow.com/a/19961575/2504224 an .
Geo und
1
geoand - Das ist das gleiche, was ich in der eigentlichen Frage verlinkt habe. Ich fürchte, das ist nicht hilfreich.
Aaron Zeckoski
2
Dave - Durch Hinzufügen dieser Konfiguration kann ich auf die H2-Konsole zugreifen und die Tabellen anzeigen, aber es hilft mir nicht zu verstehen, ob dies der richtige Weg ist (ich würde es vorziehen, bis zum Frühjahr auf das eine Setup zuzugreifen, wenn ich keine habe Einstellungen) oder wie man die JDBC-Verbindungsfeder verwendet.
Aaron Zeckoski
1
Verwenden Sie die JDBC-URL: jdbc: h2: mem: testdb
Chinmoy

Antworten:

110

So habe ich die H2-Konsole im Spring-Boot mit H2 zum Laufen gebracht. Ich bin mir nicht sicher, ob dies richtig ist, aber da niemand eine Lösung angeboten hat, werde ich vorschlagen, dass dies der beste Weg ist, dies zu tun.

In meinem Fall habe ich einen bestimmten Namen für die Datenbank gewählt, damit ich beim Starten der H2-Konsole etwas eingeben kann (in diesem Fall "AZ"). Ich denke, all dies ist erforderlich, obwohl es so aussieht, als würde das Weglassen der spring.jpa.database-Plattform nichts schaden.

In application.properties:

spring.datasource.url=jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

In Application.java (oder einer Konfiguration):

@Bean
public ServletRegistrationBean h2servletRegistration() {
    ServletRegistrationBean registration = new ServletRegistrationBean(new WebServlet());
    registration.addUrlMappings("/console/*");
    return registration;
}

Anschließend können Sie unter {server} / console / auf die H2-Konsole zugreifen. Geben Sie dies als JDBC-URL ein: jdbc: h2: mem: AZ

Aaron Zeckoski
quelle
1
Mit new WebServlet()gib mir Probleme. Welche Klasse importiert das für Sie? Es zieht für mich javax.servlet.annotation.WebServlet als einzige Option ein und ist nur eine Schnittstelle.
Splaktar
5
Oh, ich habe es verstanden, org.h2.server.web.WebServlet ist dasjenige, das benötigt wird. Mein Projekt war nicht mit Gradle synchronisiert, um die neuen h2-Bibliotheken abzurufen.
Splaktar
21
Die Teile von application.properties werden nicht benötigt. Sie können einfach den von Ihnen eingegebenen Application.java-Teil verwenden und dann eine Verbindung jdbc:h2:mem:testdbmit einem leeren Benutzernamen und einem leeren Kennwort herstellen. localhost: 8082 funktioniert mit diesem Setup.
Splaktar
2
@Splaktar Danke! Ich war verrückt nach dem Versuch, eine Verbindung herzustellen, und das fehlende Puzzleteil bestand darin, "testdb" für den Datenbanknamen zu verwenden.
Nerdherd
1
@Splaktar - Sie sollten Ihren Kommentar zur Antwort machen. Wie Sie sagten, zeigt der Quellcode für EmbeddedDatabaseConnection alle Standard-URIs für Embedded DB Connection
karthik m
55

Ab Spring Boot 1.3.0.M3kann die H2-Konsole automatisch konfiguriert werden.

Die Voraussetzungen sind:

  • Sie entwickeln eine Web-App
  • Spring Boot Dev Tools sind aktiviert
  • H2 ist auf dem Klassenpfad

Auch wenn Sie nicht Frühling Boot - Dev - Tools verwenden , können Sie immer noch automatisch konfigurieren die Konsole durch Einstellung spring.h2.console.enabledzutrue

In diesem Teil der Dokumentation finden Sie alle Details.

Beachten Sie, dass bei der Konfiguration auf diese Weise auf die Konsole zugegriffen werden kann unter: http: // localhost: 8080 / h2-console /

geoand
quelle
Oder wie im Dokument erläutert, aktivieren Sie es mit spring.h2.console.enabled = true. Mit den Voraussetzungen wird es automatisch aktiviert.
Keiki
Was genau bedeutet die Entwicklung einer Web-App ?
garci560
Im Zusammenhang mit Spring Boot bedeutet dies, dass Sie spring-boot-starter-webals Abhängigkeit hinzugefügt haben
Geo und
1
Ich denke auch, wenn Sie localhost: 8080 / h2-console öffnen , müssen Sie jdbc: h2: mem: testdb in die jdbc-URL schreiben, um Ihre Tabellen zu sehen. Und in der URL localhost: 8080 / h2-console nach localhost müssen Sie den Anwendungsport angeben.
Anujprashar
3
@anujprashar Ich bin ziemlich sicher, jdbc:h2:mem:testdbist für die Verbindungs-URL, nicht für die URL, wo die Konsole zugänglich ist
Geo und
44

Ich habe ein schönes Tutorial zu diesem Thema gefunden:

https://springframework.guru/using-the-h2-database-console-in-spring-boot-with-spring-security/

Grundsätzlich war die richtige JDBC-URL für mich: jdbc:h2:mem:testdb

Krzysztof Kaczor
quelle
1
dumme Frage, aber dies scheint die Standard-JDBC-URL zu sein, da die Einstellung spring.datasource.name standardmäßig testdb ist. Warum, wenn das der Fall ist, wenn ich den Datenbanknamen in etwas wie foodb ändere, ist der jdbc immer noch derselbe und nicht jdbc: h2: mem: foodb
Dan Vega
2
Diese jdbc-URL jdbc: h2: mem: testdb ist korrekt. Es hat mir geholfen, endlich eine Verbindung zu der Standarddatenbank herzustellen, die von spring data jpa erstellt wurde.
Kamal Joshi
Sie können den Datenbanknamen wie folgt festlegen: spring.datasource.url = jdbc: h2: mem: test; in application.properties
Aleksei Maide
23

Von http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

H2 Web Console (H2ConsoleProperties):

spring.h2.console.enabled=true //Enable the console.
spring.h2.console.path=/h2-console //Path at which the console will be available.

Das Hinzufügen der beiden oben genannten Zeilen zu meiner Datei application.properties reichte aus, um mit dem Standardbenutzernamen (sa) und dem Standardkennwort auf die H2-Datenbank-Webkonsole zuzugreifen (leer, da Sie kein Kennwort eingeben, wenn Sie von der Benutzeroberfläche dazu aufgefordert werden).

mancini0
quelle
1
Sollte nicht sein spring.h2.console.enabled=true? False wird es deaktivieren. Und spring.h2.console.path=/h2-consoleist redundant, da dies /h2-consoleder Standardpfad von Spring Boot ist. Gemäß Dokumentation "Standardmäßig ist die Konsole unter / h2-console verfügbar. Sie können den Pfad der Konsole mithilfe der Eigenschaft spring.h2.console.path anpassen." Weitere Details hier docs.spring.io/spring-boot/docs/current/reference/html/…
Georger
Ich habe die letztere Eigenschaft eingefügt, um OP zu zeigen, wo er auf die Konsole zugreifen kann. Offensichtlich deaktiviert spring.h2.console.enabled.enabled = false die Konsole. Der Punkt ist, dass dies als Eigenschaft konfiguriert werden kann. Ich werde diese Eigenschaft aus Gründen der Klarheit auf true setzen.
Mancini0
20

Eine ähnliche Antwort mit Schritt-für-Schritt-Anleitung.

  1. Hinzufügen Entwickler - Tools Abhängigkeit zu Ihrem pom.xmloderbuild.gradle

Maven

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

Gradle

dependencies {
    compile("org.springframework.boot:spring-boot-devtools")
}
  1. Greifen Sie auf die Datenbank von zu http://localhost:8080/h2-console/
  2. Geben Sie jdbc:h2:mem:testdbals JDBC-URL an
  3. Sie sollten die Entität, die Sie in Ihrem Projekt angegeben haben, als Tabelle sehen.
biniam
quelle
2
Das Hinzufügen in den Abhängigkeitsabschnitt funktionierte für mich 'Laufzeit ("com.h2database: h2")'
Raja Nagendra Kumar
17

Ich hatte nur Eigenschaften unter /resources/application.properties. Nach dem Ausführen von Spring Boot unter Verwendung dieser URL ( http: // localhost: 8080 / h2-console / ) wurde die Tabelle in der H2-Konsole angezeigt und gelesen, um die Tabellendaten anzuzeigen. Sie können auch einfache SQL-Befehle ausführen. Eine Sache, in Ihrem Java-Code, während Sie Daten abrufen, sind die Spaltennamen in Großbuchstaben, obwohl schema.sql Kleinbuchstaben verwendet :)

spring.datasource.initialize=true
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=- 1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true
rak22
quelle
16

Für Spring Boot 2.1.1 direkt von Spring Initialzr:

  1. Die Standardeinstellung für devtools ist http://127.0.0.1:8080/h2-console/.

    • POM: Spring-Boot-Starter, H2, Spring-Boot-Starter-Web, Spring-Boot-Devtools
  2. Ohne devtools müssen Sie es in den Eigenschaften festlegen:spring.h2.console.enabled=true spring.h2.console.path=/h2-console

    • POM: Spring-Boot-Starter, H2, Spring-Boot-Starter-Web

Sobald Sie dort angekommen sind, legen Sie die JDBC-URL fest: jdbc: h2: mem: testdb (Die Standard-URL funktioniert nicht)

Witold Kaczurba
quelle
10

Wenn Sie die Entwicklertools von Spring Boot verwenden, ist die H2-Konsole standardmäßig aktiviert. Es kann von /h2-console/ zugegriffen werden . JDBC URLVerwenden Sie auf der Anmeldeschnittstelle den Wert für die Eingabe jdbc:h2:mem:testdb. Achten Sie auf die memSaite.

Wenn Sie nicht Frühlings - Boot - Entwickler - Tools verwenden, können Sie die Konsole in aktivieren application.propertiesverwenden spring.h2.console.enabled=true. Dadurch wird die Konsole unter aktiviert /h2-console. Wenn Sie die URL ändern möchten, können Sie einen weiteren Eintrag mit hinzufügenspring.h2.console.path=my_console_path .

Der Standardschemaname lautet testdb.

Weitere Details finden Sie in der Spring Boot-Dokumentation .

Georger
quelle
4
Warum wird nicht jdbc:h2:mem:testdbals Standard-JDBC-URL festgelegt? Ich habe viel Zeit damit verbracht, darüber nachzudenken, wo meine JPA-Entitäten schief gelaufen sind
Sudip Bhandari
10

Überprüfen Sie die Eigenschaften der Federanwendung

spring.datasource.url = jdbc: h2: mem: testdb; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = FALSE

Hier ist testdb datenbankdefiniert. Stellen Sie sicher, dass die h2-Konsole denselben Wert hat, während Sie eine Verbindung herstellen. Andernfalls wird eine Verbindung zur Standard-Datenbank hergestellt

Geben Sie hier die Bildbeschreibung ein

Vaquar Khan
quelle
1
makellose Antwort!
Gaurav
6

Um die Tabellen zu erhalten, müssen Sie lediglich 2 SQL-Dateien schema.sql (für die Tabellenerstellung) und data.sql (Daten für die erstellten Tabellen) erstellen. Diese Dateien werden im Ordner src / main / resources abgelegt. Spring Boot erkennt sie automatisch und kümmert sich zur Laufzeit um den Rest.

Wenn Sie mehr als 2 DBs in Ihrem Projekt verwenden, stellen Sie sicher, dass Sie bestimmte Dateien wie (schema-h2.sql - für h2 DB, schema-oracle.sql - für oracle DB) verwenden. Das gleiche gilt auch für data.sql.

Stellen Sie außerdem sicher, dass Sie Tabellen löschen, indem Sie die Anweisung drop table in Ihrer schema.sql als erste Anweisung hinzufügen. So vermeiden Sie das Anhängen doppelter Datensätze.

Der Link zum Spring Boot ist hier.

Meine application.properties lautet wie folgt.

spring.datasource.url=jdbc:h2:~/file/Shiva;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.platform=h2
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
spring.datasource.initialize=true 
spring.error.whitelabel.enabled=true
spring.h2.console.path=/console
spring.datasource.continue-on-error=true
spring.jpa.hibernate.ddl-auto=create
spring.hibernate.hbm2ddl.auto=update
spring.hibernate.show_sql=true

Sie können den Schritten unter dem folgenden Link folgen.

https://springframework.guru/using-the-h2-database-console-in-spring-boot-with-spring-security/

kemparaj565
quelle
"spring.jpa.hibernate.ddl-auto" zweimal mit unterschiedlichen Werten ...
Yura
3

Ich habe festgestellt, dass mit Spring Boot 2.0.2.RELEASE die Konfiguration von Spring-Boot-Starter-Data-JPA und com.h2database in der POM-Datei nicht ausreicht, um die H2-Konsole zum Laufen zu bringen. Sie müssen spring-boot-devtools wie folgt konfigurieren. Optional können Sie den Anweisungen von Aaron Zeckoski in diesem Beitrag folgen

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
 </dependency>
Pragnesh Rana
quelle
3

Verwenden Sie jdbc: h2: mem: testdb als Pfad, wenn Sie sich bei der H2-Konsole anmelden.

Wenn Sie die Spring Boot-Eigenschaften geändert haben, ist Ihre Datenquelle möglicherweise anders, aber es scheint, als hätten Sie Probleme, die Standardeinstellung zu finden. Das ist alles dazu! Sie sehen Ihr Schema, nachdem Sie sich bei H2 angemeldet haben.


quelle
1

Ich hatte einen sehr dummen Fehler gemacht, als ich das gleiche Problem hatte. Ich hatte H2 DB hinzugefügt, um Unit-Testfälle auszuführen, und daher hatte ich den Wert scopeauf testin gesetzt pom.xml. Beim Ausführen der Anwendung mit habe mvn spring:runich das entfernt scopeund es funktioniert jetzt einwandfrei.

AbhishekB
quelle