connessione Spring Boot predefinita H2 jdbc (e console H2)


108

Sto semplicemente cercando di vedere il contenuto del database H2 per un database H2 incorporato che spring-boot crea quando non specifico nulla nel mio application.properties e inizio con mvn spring: run. Riesco a vedere l'ibernazione di JPA durante la creazione delle tabelle, ma se provo ad accedere alla console h2 dall'URL sotto il database non ha tabelle.

http://localhost:8080/console/

Vedo suggerimenti come questo: Visualizza il contenuto del database H2 incorporato avviato da Spring

Ma non so dove mettere l'XML suggerito in spring-boot e anche se lo facessi, non voglio che h2console sia più disponibile quando è configurato un database esterno, quindi è più probabile che io debba gestirlo con una sorta di codice condizionale (o forse consenti solo alla molla di gestirlo automaticamente nel caso ideale in cui includo solo H2 quando è attivato un profilo Maven).

Qualcuno ha un codice di esempio che mostra come far funzionare la console H2 all'avvio (e anche il modo per scoprire qual è la stringa di connessione jdbc che utilizza la molla)?


Posso in parte rispondere alla mia domanda aggiungendo questo al mio 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 = Ma quello che voglio davvero sapere è come gestire la configurazione a livello di programmazione (o almeno come scoprire le impostazioni predefinite di primavera)
Aaron Zeckoski

Dai un'occhiata a questo stackoverflow.com/a/19961575/2504224 .
geoand

1
geoand: è la stessa cosa che ho collegato nella domanda effettiva, quindi temo che non sia utile.
Aaron Zeckoski

2
Dave - Aggiungendo quella configurazione sono in grado di accedere alla console H2 e vedere le tabelle ma non mi aiuta a capire se è il modo giusto per farlo (preferirei accedere a quella di configurazione entro la primavera quando non ho impostazioni) o come ottenere la molla di connessione JDBC utilizzata.
Aaron Zeckoski

1
Usa l'URL JDBC: jdbc: h2: mem: testdb
Chinmoy

Risposte:


110

Questo è il modo in cui la console H2 funziona in avvio primaverile con H2. Non sono sicuro che sia giusto, ma poiché nessun altro ha offerto una soluzione, suggerirò che questo è il modo migliore per farlo.

Nel mio caso, ho scelto un nome specifico per il database in modo da avere qualcosa da inserire all'avvio della console H2 (in questo caso, "AZ"). Penso che tutti questi siano necessari anche se sembra che tralasciare la piattaforma spring.jpa.database non faccia male a nulla.

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 (o qualche configurazione):

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

Quindi puoi accedere alla console H2 su {server} / console /. Inseriscilo come URL JDBC: jdbc: h2: mem: AZ


1
Utilizzando new WebServlet()dammi problemi. Quale classe sta importando per te? Per me sta inserendo javax.servlet.annotation.WebServlet come unica opzione ed è solo un'interfaccia.
Splaktar

5
Oh, ho capito, org.h2.server.web.WebServlet è quello che è necessario. Il mio progetto non era sincronizzato con Gradle per inserire le nuove librerie h2.
Splaktar

21
I pezzi application.properties non sono necessari. Puoi semplicemente usare la parte Application.java che hai inserito, quindi connetterti jdbc:h2:mem:testdbcon un nome utente vuoto e una password vuota. localhost: 8082 funziona con questa configurazione.
Splaktar

2
@Splaktar Grazie! Stavo impazzendo cercando di capire come connettermi e il pezzo mancante del puzzle era usare "testdb" per il nome del database.
nerdherd

1
@Splaktar - dovresti rendere il tuo commento la risposta. Come hai detto tu, il codice sorgente di EmbeddedDatabaseConnection mostra tutti gli URI di connessione DB incorporati predefiniti
karthik m

55

A partire da Spring Boot 1.3.0.M3, la console H2 può essere configurata automaticamente.

I prerequisiti sono:

  • Stai sviluppando un'app Web
  • Gli strumenti di sviluppo Spring Boot sono abilitati
  • H2 è sul classpath

Anche se non utilizzi Spring Boot Dev Tools, puoi comunque configurare automaticamente la console impostando spring.h2.console.enabledsutrue

Dai un'occhiata a questa parte della documentazione per tutti i dettagli.

Notare che quando si configura in questo modo la console è accessibile a: http: // localhost: 8080 / h2-console /


O come spiegato nel documento lo abiliti con spring.h2.console.enabled = true. Con i prerequisiti viene abilitato automaticamente.
keiki

Che cosa significa esattamente stai sviluppando un'app Web ?
garci560

Nel contesto di Spring Boot, significa che hai aggiunto spring-boot-starter-webcome dipendenza
geoand

1
Inoltre penso che quando apri localhost: 8080 / h2-console devi scrivere jdbc: h2: mem: testdb nell'URL di jdbc per vedere le tue tabelle. E in url localhost: 8080 / h2-console dopo localhost è necessario specificare la porta dell'applicazione.
anujprashar

3
@anujprashar Sono abbastanza sicuro che jdbc:h2:mem:testdbsia per l'URL di connessione, non per l'URL dove la console è accessibile
geoand

44

Ho trovato un bel tutorial su questo argomento:

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

Fondamentalmente l'URL JDBC corretto per me era: jdbc:h2:mem:testdb


1
domanda stupida ma questo sembra essere l'URL JDBC predefinito perché l'impostazione spring.datasource.name è di default testdb. Perché se questo è il caso se cambio il nome del db in qualcosa come foodb, il jdbc è sempre lo stesso e non jdbc: h2: mem: foodb
Dan Vega

2
Questo jdbc url jdbc: h2: mem: testdb è corretto. Mi ha aiutato finalmente a connettermi al database predefinito creato da Spring Data jpa.
Kamal Joshi

È possibile impostare il nome del database come qualsiasi cosa come: spring.datasource.url = jdbc: h2: mem: test; in application.properties
Aleksei Maide

23

Da 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.

L'aggiunta delle due righe sopra al mio file application.properties è stata sufficiente per accedere alla console web del database H2, utilizzando il nome utente (sa) e la password predefiniti (vuoti, come in non inserire una password quando l'interfaccia utente te lo richiede).


1
Non dovrebbe essere spring.h2.console.enabled=true? False lo disabiliterà. Ed spring.h2.console.path=/h2-consoleè ridondante perché /h2-consoleè il percorso predefinito da Spring Boot. Come da documentazione "Per impostazione predefinita, la console sarà disponibile in / h2-console. Puoi personalizzare il percorso della console utilizzando la proprietà spring.h2.console.path." Maggiori dettagli qui docs.spring.io/spring-boot/docs/current/reference/html/…
georger

Ho incluso quest'ultima proprietà per mostrare a OP dove può accedere alla console. Ovviamente spring.h2.console.enabled.enabled = false disabiliterà la console, il punto è che questa è configurabile come proprietà. Imposterò quella proprietà su true per chiarezza.
mancini0

20

Una risposta simile con la guida passo passo.

  1. Aggiungi la dipendenza Strumenti per sviluppatori al tuo file pom.xmlobuild.gradle

Esperto di

<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. Accedi al db da http://localhost:8080/h2-console/
  2. Specificare jdbc:h2:mem:testdbcome URL JDBC
  3. Dovresti vedere l'entità che hai specificato nel tuo progetto come una tabella.

2
l'aggiunta di questo nella sezione delle dipendenze ha funzionato per me 'runtime ("com.h2database: h2")'
Raja Nagendra Kumar

17

Avevo solo sotto le proprietà in /resources/application.properties. Dopo aver eseguito l'avvio a molla, utilizzando questo URL ( http: // localhost: 8080 / h2-console / ), la tabella nella console H2 era visibile e letta per visualizzare i dati della tabella, inoltre è possibile eseguire semplici comandi SQL. Una cosa, nel tuo codice java, durante il recupero dei dati, i nomi delle colonne sono in maiuscolo, anche se schema.sql utilizza nomi in minuscolo :)

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

16

Per Spring Boot 2.1.1 direttamente da Spring Initialzr:

  1. L'impostazione predefinita con devtools è http://127.0.0.1:8080/h2-console/

    • POM: spring-boot-starter, h2, spring-boot-starter-web, spring-boot-devtools
  2. Senza devtools , è necessario impostarlo nelle proprietà:spring.h2.console.enabled=true spring.h2.console.path=/h2-console

    • POM: molla-avvio-avvio, h2, primavera-avvio-avvio-web

Una volta arrivato, imposta l'URL JDBC: jdbc: h2: mem: testdb (quello predefinito non funzionerà)


10

Se utilizzi gli strumenti di sviluppo di Spring Boot, viene fornito con H2 Console abilitata per impostazione predefinita. È possibile accedervi da /h2-console/. Nell'interfaccia di accesso, per l'input JDBC URLutilizzare il valore jdbc:h2:mem:testdb. Presta attenzione allo memspago.

Se non utilizzi gli strumenti di sviluppo di Spring Boot, puoi abilitare la console in application.propertiesuso spring.h2.console.enabled=true. Questo abiliterà la console sotto /h2-console. Se desideri modificare l'URL, puoi aggiungere un'altra voce con spring.h2.console.path=my_console_path.

Il nome dello schema predefinito è testdb.

Maggiori dettagli nella documentazione di Spring Boot .


4
Perché non è jdbc:h2:mem:testdbimpostato come URL jdbc predefinito? Ho passato molto tempo a riflettere su dove le mie entità jpa sono andate male
Sudip Bhandari

10

Controllare le proprietà dell'applicazione della molla

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

qui testdb è definito dal database Assicurati che la console h2 abbia lo stesso valore mentre ti connetti in altro modo si connetterà al database predefinito

inserisci qui la descrizione dell'immagine


1
risposta impeccabile!
gaurav

6

Per ottenere le tabelle, tutto ciò che devi fare è creare 2 file sql schema.sql (per la creazione della tabella) e data.sql (dati per le tabelle create). Questi file devono essere messi nella cartella src / main / resources. Spring boot li rileva automaticamente e si occupa del resto durante il runtime.

Se utilizzi più di 2 DB nel tuo progetto, assicurati di utilizzare file specifici come (schema-h2.sql - per h2 DB, schema-oracle.sql - per Oracle DB). Lo stesso da seguire anche per data.sql.

Assicurati inoltre di eliminare le tabelle aggiungendo l'istruzione drop table nel tuo schema.sql come prima istruzione. Per evitare l'aggiunta di record duplicati.

Il link per lo stivale primaverile è qui.

La mia application.properties è la seguente.

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

Puoi seguire i passaggi nel link sottostante.

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


"spring.jpa.hibernate.ddl-auto" due volte con valori diversi ...
Yura

3

Ho scoperto che con lo spring boot 2.0.2.RELEASE, configurare spring-boot-starter-data-jpa e com.h2database nel file POM non è sufficiente per far funzionare la console H2. È necessario configurare spring-boot-devtools come di seguito. Facoltativamente potresti seguire le istruzioni di Aaron Zeckoski in questo post

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

3

Usa jdbc: h2: mem: testdb come percorso quando accedi alla console H2.

Ovviamente se hai modificato le proprietà di Spring Boot, la tua origine dati potrebbe essere diversa, ma sembra che tu stia lottando per trovare l'impostazione predefinita. È tutto quello che c'è da fare! Vedrai il tuo schema dopo aver effettuato l'accesso a H2.


1

Avevo commesso un errore molto stupido quando ho avuto lo stesso problema. Avevo aggiunto H2 DB per l'esecuzione di casi di test unità e, quindi, avevo impostato la scopea testin pom.xml. Durante l'esecuzione dell'applicazione utilizzando mvn spring:runho rimosso scopee ora funziona correttamente.


0

Per Spring Boot 2.3.3 RILASCIARE direttamente da Spring Initialzr:

POM: dati jpa, h2, web

proprietà dell'applicazione: spring.h2.console.enabled=true

Quando esegui l'applicazione, cerca la riga come sotto nella console di esecuzione:

2020-08-18 21:12:32.664  INFO 63256 --- [           main] o.s.b.a.h2.H2ConsoleAutoConfiguration    : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:eaa9d6da-aa2e-4ad3-9e5b-2b60eb2fcbc5'

Ora usa l'URL JDBC sopra per h2-console e fai clic su Connect.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.