Spring boot default H2 jdbc connection (и H2 console)


108

Я просто пытаюсь просмотреть содержимое базы данных H2 для встроенной базы данных H2, которую создает spring -boot, когда я ничего не указываю в моем application.properties и начинаю с mvn spring: run. Я вижу, как hibernate JPA создает таблицы, но если я попытаюсь получить доступ к консоли h2 по указанному ниже URL-адресу, в базе данных нет таблиц.

http://localhost:8080/console/

Я вижу такие предложения: Просмотр содержимого встроенной базы данных H2, созданной Spring

Но я не знаю, где разместить предлагаемый XML в spring -boot, и даже если бы я это сделал, я не хочу, чтобы h2console больше была доступна, когда настроена внешняя база данных, поэтому более вероятно, что мне нужно справиться с этим. с каким-то условным кодом (или, может быть, просто позволить Spring автоматически обрабатывать его в наиболее идеальном случае, когда я включаю только H2, когда активирован профиль maven).

Есть ли у кого-нибудь пример кода, показывающий, как заставить консоль H2 работать при загрузке (а также способ узнать, что такое строка подключения jdbc, которую использует Spring)?


Я могу частично ответить на свой вопрос, добавив это в свой 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 по

Посмотрите этот stackoverflow.com/a/19961575/2504224 .
geoand

1
geoand - это то же самое, что я связал в собственном вопросе, поэтому, боюсь, это бесполезно.
Aaron Zeckoski

2
Дэйв - Добавив эту конфигурацию, я могу получить доступ к консоли H2 и увидеть таблицы, но это не помогает мне понять, правильный ли это способ сделать это (я бы предпочел получить доступ к одной настройке весной, когда у меня нет settings) или как получить пружину подключения JDBC.
Aaron Zeckoski

1
Использовать URL-адрес JDBC: jdbc: h2: mem: testdb
Чинмой

Ответы:


111

Вот как я получил консоль H2, работающую в весенней загрузке с H2. Я не уверен, правильно ли это, но, поскольку никто другой не предлагал решения, я собираюсь предположить, что это лучший способ сделать это.

В моем случае я выбрал конкретное имя для базы данных, чтобы мне было что вводить при запуске консоли H2 (в данном случае «AZ»). Я думаю, что все это необходимо, хотя кажется, что отказ от spring.jpa.database-platform ничему не повредит.

В 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

В Application.java (или в какой-то конфигурации):

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

Затем вы можете получить доступ к консоли H2 по адресу {server} / console /. Введите это как URL-адрес JDBC: jdbc: h2: mem: AZ


1
Используя new WebServlet()дайте мне проблемы. Какой класс это импортирует для вас? Для меня он использует javax.servlet.annotation.WebServlet как единственный вариант, и это всего лишь интерфейс.
Splaktar

5
О, я понял, org.h2.server.web.WebServlet - это тот, который нужен. Мой проект не был синхронизирован с Gradle, чтобы использовать новые библиотеки h2.
Splaktar

21
Части application.properties не нужны. Вы можете просто использовать вставленную вами часть Application.java, а затем подключиться jdbc:h2:mem:testdbс пустым именем пользователя и пустым паролем. localhost: 8082 работает с этой настройкой.
Splaktar

2
@Splaktar Спасибо! Я сходил с ума, пытаясь понять, как подключиться, и упущенной частью головоломки было использование "testdb" в качестве имени базы данных.
ботаник

1
@Splaktar - сделайте свой комментарий ответом. Как вы сказали, исходный код для EmbeddedDatabaseConnection показывает все URI подключения к встроенной базе данных по умолчанию
karthik m

55

Начиная с Spring Boot 1.3.0.M3, консоль H2 может быть настроена автоматически.

Предпосылки:

  • Вы разрабатываете веб-приложение
  • Инструменты разработки Spring Boot включены
  • H2 находится в пути к классам

Даже если вы не используете Spring Boot Dev Tools, вы все равно можете автоматически настроить консоль, установив spring.h2.console.enabledзначениеtrue

Ознакомьтесь с этой частью документации, чтобы узнать все подробности.

Обратите внимание, что при такой настройке консоль доступна по адресу: http: // localhost: 8080 / h2-console /


Или, как описано в документе, вы включаете его с помощью spring.h2.console.enabled = true. При наличии предварительных условий он включается автоматически.
keiki

Что именно означает вы разрабатываете веб-приложение ?
garci560

В контексте Spring Boot это означает, что вы добавили spring-boot-starter-webв качестве зависимости
geo и

1
Также я думаю, что когда вы открываете localhost: 8080 / h2-console, вам нужно написать jdbc: h2: mem: testdb в URL-адресе jdbc, чтобы увидеть свои таблицы. А в url localhost: 8080 / h2-console после localhost нужно указать порт приложения.
ануджпрашар

3
@anujprashar Я почти уверен, что jdbc:h2:mem:testdbэто для URL-адреса подключения, а не для URL-адреса, по
которому

44

Я нашел хороший учебник по этой теме:

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

В основном правильный URL-адрес JDBC для меня был: jdbc:h2:mem:testdb


1
глупый вопрос, но, похоже, это URL-адрес JDBC по умолчанию, потому что параметр spring.datasource.name по умолчанию равен testdb. Почему, если это так, если я изменил имя db на что-то вроде foodb, jdbc все еще тот же, а не jdbc: h2: mem: foodb
Дэн Вега

2
Этот URL-адрес jdbc jdbc: h2: mem: testdb правильный. Это помогло мне наконец подключиться к базе данных по умолчанию, созданной с помощью spring data jpa.
Камаль Джоши

Вы можете установить любое имя базы данных, например: spring.datasource.url = jdbc: h2: mem: test; в application.properties
Алексей Мейд

23

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

Веб-консоль H2 (H2ConsoleProperties):

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

Добавление двух приведенных выше строк в мой файл application.properties было достаточно для доступа к веб-консоли базы данных H2 с использованием имени пользователя (sa) и пароля по умолчанию (пусто, например, не вводите пароль, когда пользовательский интерфейс запрашивает вас).


1
Не должно быть spring.h2.console.enabled=true? Значение false отключит его. И spring.h2.console.path=/h2-consoleявляется избыточным, потому что /h2-consoleэто путь по умолчанию из Spring Boot. Согласно документации «По умолчанию консоль будет доступна в / h2-console. Вы можете настроить путь к консоли, используя свойство spring.h2.console.path». Подробнее здесь docs.spring.io/spring-boot/docs/current/reference/html/…
georger

Я включил последнее свойство, чтобы показать OP, где он может получить доступ к консоли. Очевидно, что spring.h2.console.enabled.enabled = false отключит консоль, дело в том, что это можно настроить как свойство. Я установлю это свойство в значение true для ясности.
mancini0 06

20

Аналогичный ответ с пошаговым руководством.

  1. Добавьте зависимость инструментов разработчика к вашему pom.xmlилиbuild.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. Доступ к БД из http://localhost:8080/h2-console/
  2. Укажите jdbc:h2:mem:testdbкак URL-адрес JDBC
  3. Вы должны увидеть объект, который вы указали в своем проекте, в виде таблицы.

2
добавление этого в раздел зависимостей сработало для меня 'runtime ("com.h2database: h2")'
Раджа Нагендра Кумар

17

У меня были только свойства ниже в /resources/application.properties. После запуска весенней загрузки с использованием этого URL-адреса ( http: // localhost: 8080 / h2-console / ) таблица в консоли H2 была видна и прочитана для просмотра данных таблицы, также вы можете запускать простые команды SQL. Во-первых, в вашем java-коде при выборке данных имена столбцов пишутся в верхнем регистре, хотя schema.sql использует имена в нижнем регистре :)

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

Для Spring Boot 2.1.1 прямо из Spring Initialzr:

  1. По умолчанию с Devtools является http://127.0.0.1:8080/h2-console/

    • POM: spring-boot-starter, h2, spring-boot-starter-web, spring-boot-devtools
  2. Без devtools - нужно установить в свойствах:spring.h2.console.enabled=true spring.h2.console.path=/h2-console

    • ПОМ: пружинно-загрузочный стартер, h2, пружинный-загрузочный-стартовый

Как только вы попадете туда - установите JDBC URL: jdbc: h2: mem: testdb (по умолчанию не будет работать)


10

Если вы используете инструменты разработчика Spring Boot, по умолчанию в нем включена консоль H2. Доступ к нему можно получить из /h2-console/. В интерфейсе входа в систему для ввода JDBC URLиспользуйте значение jdbc:h2:mem:testdb. Обратите внимание на memстроку.

Если вы не используете инструменты разработчика Spring Boot, вы можете включить консоль в application.propertiesusing spring.h2.console.enabled=true. Это включит консоль под /h2-console. Если вы хотите изменить URL-адрес, вы можете добавить еще одну запись с помощью spring.h2.console.path=my_console_path.

Имя схемы по умолчанию - testdb.

Подробнее в документации по Spring Boot .


4
Почему не jdbc:h2:mem:testdbустановлен URL-адрес jdbc по умолчанию? Я потратил много времени на размышления о том, где мои jpa-сущности пошли не так,
Судип Бхандари

10

Проверить Spring application.properties

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

здесь testdb определяется базой данных. Убедитесь, что консоль h2 имеет такое же значение при подключении, в противном случае она подключится к базе данных по умолчанию.

введите описание изображения здесь


1
безупречный ответ!
Gaurav,

6

Чтобы получить таблицы, все, что вам нужно сделать, это создать 2 sql файла schema.sql (для создания таблиц) и data.sql (данные для созданных таблиц). Эти файлы нужно поместить в папку src / main / resources. Spring boot автоматически обнаруживает их и позаботится обо всем остальном во время выполнения.

Если в вашем проекте используется более 2 БД, убедитесь, что вы используете определенные файлы, например (schema-h2.sql - для БД h2, schema-oracle.sql - для БД Oracle). То же самое следует соблюдать и для data.sql.

Также убедитесь, что вы удаляете таблицы, добавляя оператор drop table в свой schema.sql в качестве первого оператора. Чтобы избежать добавления повторяющихся записей.

Ссылка на весеннюю загрузку здесь.

Мой application.properties выглядит следующим образом.

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

Вы можете следовать инструкциям по приведенной ниже ссылке.

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


"spring.jpa.hibernate.ddl-auto" дважды с разными значениями ...
Юра

3

Я обнаружил, что с весенней загрузкой 2.0.2.RELEASE настройки spring-boot-starter-data-jpa и com.h2database в файле POM недостаточно для работы консоли H2. Вы должны настроить spring-boot-devtools, как показано ниже. При желании вы можете следовать инструкциям Аарона Зекоски в этом посте.

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

3

Используйте jdbc: h2: mem: testdb в качестве пути при входе в консоль H2.

Очевидно, что если вы изменили свойства Spring Boot, ваш источник данных может быть другим, но похоже, что вы боретесь с тем, как найти значение по умолчанию. Вот и все! Вы увидите свою схему после входа в H2.


1

Я совершил очень глупую ошибку, когда столкнулся с такой же проблемой. Я добавил H2 DB для запуска случаев блока тестирования и , следовательно я установить , scopeчтобы testв pom.xml. При запуске приложения с использованием mvn spring:runя удалил, scopeи теперь он работает нормально.


1

Для Spring Boot 2.3.3.RELEASE прямо из Spring Initialzr:

POM: данные jpa, h2, web

свойства приложения: spring.h2.console.enabled=true

Когда вы запустите приложение, найдите в консоли запуска строку, как показано ниже:

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'

Теперь используйте указанный выше URL-адрес JDBC для h2-console и нажмите Connect.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.