Spring boot domyślne połączenie H2 jdbc (i konsola H2)

108

Po prostu próbuję zobaczyć zawartość bazy danych H2 dla osadzonej bazy danych H2, którą tworzy spring-boot, gdy nie określam niczego w pliku application.properties i zaczynam od mvn spring: run. Widzę hibernację JPA tworzącą tabele, ale jeśli spróbuję uzyskać dostęp do konsoli h2 pod adresem URL poniżej, baza danych nie ma tabel.

http://localhost:8080/console/

Widzę sugestie takie jak ta: Wyświetl zawartość wbudowanej bazy danych H2 uruchomionej przez Spring

Ale nie wiem, gdzie umieścić sugerowany XML podczas rozruchu sprężynowego, a nawet gdybym to zrobił, nie chcę, aby konsola h2 była już dostępna, gdy skonfigurowana jest zewnętrzna baza danych, więc jest bardziej prawdopodobne, że będę musiał sobie z tym poradzić z jakimś rodzajem kodu warunkowego (a może po prostu pozwól sprężynie na automatyczną obsługę tego w najbardziej idealnym przypadku, w którym dołączam H2 tylko po aktywowaniu profilu maven).

Czy ktoś ma przykładowy kod pokazujący, jak uruchomić konsolę H2 podczas rozruchu (a także sposób, aby dowiedzieć się, jakie parametry połączenia jdbc używa tej sprężyny)?

Aaron Zeckoski
źródło
Mogę częściowo odpowiedzieć na swoje pytanie, dodając je do mojej 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 = Ale to, co naprawdę chcę wiedzieć, to programowe zarządzanie konfiguracją (a przynajmniej jak sprawdzić domyślne ustawienia sprężyny)
Aaron Zeckoski
Zajrzyj na ten stackoverflow.com/a/19961575/2504224 .
geo i
1
geoand - to ta sama rzecz, którą połączyłem w rzeczywistym pytaniu, więc obawiam się, że to nie jest pomocne.
Aaron Zeckoski,
2
Dave - Dodając tę ​​konfigurację, jestem w stanie uzyskać dostęp do konsoli H2 i zobaczyć tabele, ale nie pomaga mi to zrozumieć, czy jest to właściwy sposób (wolałbym uzyskać dostęp do jednej konfiguracji wiosną, gdy nie mam ustawienia) lub jak uzyskać sprężynę połączenia JDBC.
Aaron Zeckoski
1
Użyj adresu URL JDBC: jdbc: h2: mem: testdb
Chinmoy

Odpowiedzi:

110

W ten sposób uzyskałem konsolę H2 pracującą w spring-boot z H2. Nie jestem pewien, czy to prawda, ale ponieważ nikt inny nie zaproponował rozwiązania, zasugeruję, że jest to najlepszy sposób.

W moim przypadku wybrałem konkretną nazwę dla bazy danych, żeby mieć coś do wpisania podczas uruchamiania konsoli H2 (w tym przypadku „AZ”). Myślę, że wszystkie te elementy są wymagane, chociaż wydaje się, że pominięcie platformy spring.jpa.database-platform niczego nie boli.

W 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

W Application.java (lub w innej konfiguracji):

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

Następnie możesz uzyskać dostęp do konsoli H2 pod adresem {server} / console /. Wpisz to jako adres URL JDBC: jdbc: h2: mem: AZ

Aaron Zeckoski
źródło
1
Używanie new WebServlet()daj mi problemy. Które zajęcia są dla Ciebie importowane? Pobiera javax.servlet.annotation.WebServlet jako jedyną opcję i jest to tylko interfejs.
Splaktar
5
Och, rozumiem, org.h2.server.web.WebServlet jest tym, który jest potrzebny. Mój projekt nie był zsynchronizowany z Gradle, aby pobrać nowe biblioteki h2.
Splaktar
21
Elementy application.properties nie są potrzebne. Możesz po prostu użyć umieszczonej części Application.java, a następnie połączyć się jdbc:h2:mem:testdbz pustą nazwą użytkownika i pustym hasłem. localhost: 8082 działa z tą konfiguracją.
Splaktar
2
@Splaktar Dziękuję! Szalałem, próbując wymyślić, jak się połączyć, a brakującym elementem układanki było użycie „testdb” jako nazwy bazy danych.
nerdherd
1
@Splaktar - Twój komentarz powinien być odpowiedzią. Tak jak powiedziałeś, kod źródłowy dla EmbeddedDatabaseConnection pokazuje wszystkie domyślne identyfikatory URI wbudowanych połączeń DB
karthik m
55

Począwszy od Spring Boot 1.3.0.M3, konsola H2 może być konfigurowana automatycznie.

Wymagania wstępne to:

  • Tworzysz aplikację internetową
  • Narzędzia Spring Boot Dev są włączone
  • H2 znajduje się na ścieżce klas

Nawet jeśli nie używasz Wiosna Boot Dev Tools, można jeszcze auto-configure konsola przez ustawienie spring.h2.console.enablednatrue

Sprawdź część dokumentacji, aby poznać wszystkie szczegóły.

Zauważ, że podczas konfigurowania w ten sposób konsola jest dostępna pod adresem: http: // localhost: 8080 / h2-console /

geoand
źródło
Lub, jak wyjaśniono w dokumencie, włączasz go za pomocą spring.h2.console.enabled = true. Po spełnieniu wymagań wstępnych jest on automatycznie włączany.
keiki
Co dokładnie oznacza „Tworzysz aplikację internetową” ?
garci560
W kontekście Spring Boot oznacza to, że dodałeś spring-boot-starter-webjako zależność
geo i
1
Myślę też, że kiedy otwierasz localhost: 8080 / h2-console , musisz napisać jdbc: h2: mem: testdb w adresie URL jdbc, aby zobaczyć swoje tabele. A w url localhost: 8080 / h2-console po localhost musisz określić port aplikacji.
anujprashar
3
@anujprashar Jestem prawie pewien, że jdbc:h2:mem:testdbdotyczy adresu URL połączenia, a nie adresu URL, w którym konsola jest dostępna
geo i
44

Znalazłem fajny tutorial na ten temat:

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

Zasadniczo prawidłowy adres URL JDBC dla mnie brzmiał: jdbc:h2:mem:testdb

Krzysztof Kaczor
źródło
1
głupie pytanie, ale wydaje się, że jest to domyślny adres URL JDBC, ponieważ ustawienie spring.datasource.name domyślnie testdb. Dlaczego, jeśli tak jest, jeśli zmienię nazwę db na coś w rodzaju foodb, to jdbc nadal jest takie samo, a nie jdbc: h2: mem: foodb
Dan Vega
2
Ten adres URL jdbc jdbc: h2: mem: testdb jest poprawny. Pomogło mi to w końcu połączyć się z domyślną bazą danych utworzoną przez spring data jpa.
Kamal Joshi
Możesz ustawić dowolną nazwę bazy danych, na przykład: spring.datasource.url = jdbc: h2: mem: test; in application.properties
Aleksei Maide,
23

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

Konsola internetowa H2 (H2ConsoleProperties):

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

Dodanie powyższych dwóch wierszy do mojego pliku application.properties wystarczyło, aby uzyskać dostęp do konsoli internetowej bazy danych H2, używając domyślnej nazwy użytkownika (sa) i hasła (puste, ponieważ nie wpisuj hasła, gdy interfejs użytkownika o to poprosi).

mancini0
źródło
1
Nie powinno być spring.h2.console.enabled=true? Fałsz to wyłączy. I spring.h2.console.path=/h2-consolejest nadmiarowy, ponieważ /h2-consolejest domyślną ścieżką z Spring Boot. Zgodnie z dokumentacją „Domyślnie konsola będzie dostępna pod adresem / h2-console. Możesz dostosować ścieżkę konsoli za pomocą właściwości spring.h2.console.path”. Więcej szczegółów tutaj docs.spring.io/spring-boot/docs/current/reference/html/…
georger Kwietnia
Dodałem tę ostatnią właściwość, aby pokazać OP, gdzie może uzyskać dostęp do konsoli. Oczywiście spring.h2.console.enabled.enabled = false wyłączy konsolę, chodzi o to, że można to skonfigurować jako właściwość. Ustawię tę właściwość na true dla jasności.
mancini0
20

Podobna odpowiedź z przewodnikiem krok po kroku.

  1. Dodaj zależność narzędzi programistycznych do swojego pom.xmllubbuild.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. Uzyskaj dostęp do bazy danych z http://localhost:8080/h2-console/
  2. Podaj jdbc:h2:mem:testdbjako adres URL JDBC
  3. Jednostka, którą określiłeś w projekcie, powinna być widoczna jako tabela.
biniam
źródło
2
Dodanie tego w zależności sekcja pracował dla mnie 'starcie ( "com.h2database: h2")'
Raja Nagendra Kumar
17

Miałem tylko poniżej właściwości w /resources/application.properties. Po uruchomieniu spring boot, używając tego adresu URL ( http: // localhost: 8080 / h2-console / ), tabela w konsoli H2 była widoczna i odczytana, aby wyświetlić dane tabeli, można również uruchomić proste polecenia SQL. Jedna rzecz, w twoim kodzie java, podczas pobierania danych, nazwy kolumn są pisane dużymi literami, mimo że schema.sql używa małych liter :)

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
źródło
16

Dla Spring Boot 2.1.1 prosto z Spring Initialzr:

  1. Domyślnie z devtools jest http://127.0.0.1:8080/h2-console/

    • POM: spring-boot-starter, h2, spring-boot-starter-web, spring-boot-devtools
  2. Bez devtools - musisz to ustawić we właściwościach:spring.h2.console.enabled=true spring.h2.console.path=/h2-console

    • POM: sprężyna-rozrusznik-rozruchowy, h2, sprężyna-rozrusznik-wstęga

Jak już tam dotrzesz - ustaw URL JDBC: jdbc: h2: mem: testdb (domyślny nie będzie działał)

Witold Kaczurba
źródło
10

Jeśli korzystasz z narzędzi deweloperskich Spring Boot, jest on dostarczany z domyślnie włączoną konsolą H2. Dostęp do niego można uzyskać pod adresem /h2-console/. W interfejsie logowania do wprowadzania JDBC URLwartości użycia jdbc:h2:mem:testdb. Zwróć uwagę na memsznurek.

Jeśli nie używasz narzędzi programistycznych Spring Boot, możesz włączyć konsolę w application.propertiesużyciu spring.h2.console.enabled=true. Umożliwi to konsolę pod /h2-console. Jeśli chcesz zmienić adres URL, możesz dodać kolejny wpis za pomocą spring.h2.console.path=my_console_path.

Domyślna nazwa schematu to testdb.

Więcej szczegółów w dokumentacji Spring Boot .

George
źródło
4
Dlaczego nie jest jdbc:h2:mem:testdbustawiony jako domyślny adres URL jdbc? Spędziłem dużo czasu zastanawiając się, gdzie moje istoty jpa poszły źle
Sudip Bhandari,
10

Sprawdź zastosowanie sprężyny. Właściwości

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

tutaj testdb jest zdefiniowany w bazie danych Upewnij się, że konsola h2 ma taką samą wartość podczas łączenia się w inny sposób, połączy się z domyślną bazą danych

wprowadź opis obrazu tutaj

vaquar khan
źródło
1
bezbłędna odpowiedź!
gaurav
6

Aby uzyskać tabele, wystarczy utworzyć 2 pliki sql schema.sql (do tworzenia tabel) i data.sql (dane do utworzonych tabel). Te pliki należy umieścić w folderze src / main / resources. Spring boot automatycznie je wykrywa i zajmuje się resztą podczas działania.

Jeśli używasz więcej niż 2 DB w swoim projekcie, upewnij się, że używasz określonych plików, takich jak (schema-h2.sql - dla h2 DB, schema-oracle.sql - dla oracle DB). To samo należy przestrzegać również dla data.sql.

Upewnij się również, że usuwasz tabele, dodając instrukcję drop table do pliku schema.sql jako pierwszą instrukcję. Aby uniknąć dołączania zduplikowanych rekordów.

Link do butów sprężynowych jest tutaj.

Moja application.properties jest następująca.

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

Możesz postępować zgodnie z instrukcjami w poniższym linku.

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

kemparaj565
źródło
„spring.jpa.hibernate.ddl-auto” dwa razy z różnymi wartościami ...
Yura
3

Zauważyłem, że w przypadku spring boot 2.0.2.RELEASE skonfigurowanie spring-boot-starter-data-jpa i com.h2database w pliku POM nie wystarczy, aby konsola H2 działała. Musisz skonfigurować spring-boot-devtools jak poniżej. Opcjonalnie możesz postępować zgodnie z instrukcjami Aarona Zeckoskiego w tym poście

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
 </dependency>
Pragnesh Rana
źródło
3

Użyj jdbc: h2: mem: testdb jako ścieżki podczas logowania się do konsoli H2.

Oczywiście, jeśli zmieniłeś właściwości Spring Boot, twoje źródło danych może być inne, ale wygląda na to, że masz problem ze znalezieniem wartości domyślnej. To wszystko! Po zalogowaniu się do H2 zobaczysz swój schemat.


źródło
1

Popełniłem bardzo głupi błąd, gdy miałem ten sam problem. Dodałem H2 DB do uruchamiania przypadków testowych jednostek i dlatego ustawiłem scopeopcję testin pom.xml. Podczas uruchamiania aplikacji za pomocą mvn spring:runusunąłem scopei teraz działa dobrze.

AbhishekB
źródło
0

Dla Spring Boot 2.3.3. RELEASE prosto z Spring Initialzr:

POM: dane jpa, h2, web

właściwości aplikacji: spring.h2.console.enabled=true

Po uruchomieniu aplikacji w konsoli uruchamiania szukaj linii jak poniżej:

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'

Teraz użyj powyższego adresu URL JDBC dla konsoli h2 i kliknij Connect.

RahulDeep Attri
źródło