Как настроить spring-boot для использования файловой базы данных H2
Я успешно создал приложение весенней загрузки, которое использует встроенную базу данных H2 в памяти. Теперь я хотел бы изменить это на файловую версию, которая будет сохраняться.
Я пытался просто изменить spring.datasource.*
свойства в моем application.properties
файл, и они выглядят примерно так:
spring.datasource.url=jdbc:h2:file:~/test;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.driverClassName=org.h2.Driver`
Кажется, что весенняя загрузка просто игнорирует эти настройки, потому что она начинается следующим образом:
o.s.j.d.e.EmbeddedDatabaseFactory : Starting embedded database: url='jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'
мой pom.xml
содержит следующие зависимости, которые могут иметь отношение к этому сообщению:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
</parent>
....
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
Насколько я понимаю из документации и ряда постов, конфигурация должна работать, но мне не повезло. Просто, чтобы предотвратить некоторые из основных ошибок, я попробовал и проверил следующее:
- Мои свойства приложения находятся в classspath:
- Я пытался исключить автоконфигурацию в аннотации
@EnableAutoConfiguration
- Я пытался ввести
dataSource
фасоль с комбинациями аннотаций@Primary
,@ConfigurationProperties(prefix = "spring.datasource")
и установка свойств программно сDataSourceBuilder
, Это вызывает другие ошибки, связанные с типомnull
,
Кажется, мне не хватает ключевой концепции или чего-то еще. Может кто-нибудь помочь.
ОБНОВЛЕНИЕ 1: Извлечение из моего отчета автоконфигурации:
Positive matches:
-----------------
DataSourceAutoConfiguration matched
- @ConditionalOnClass classes found: javax.sql.DataSource,org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType (OnClassCondition)
DataSourceAutoConfiguration.DataSourceInitializerConfiguration matched
- @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer; SearchStrategy: all) found no beans (OnBeanCondition)
DataSourceAutoConfiguration.EmbeddedConfiguration matched
- embedded database H2 detected (DataSourceAutoConfiguration.EmbeddedDataSourceCondition)
- @ConditionalOnMissingBean (types: javax.sql.DataSource,javax.sql.XADataSource; SearchStrategy: all) found no beans (OnBeanCondition)
DataSourceAutoConfiguration.JdbcTemplateConfiguration matched
- existing auto database detected (DataSourceAutoConfiguration.DataSourceAvailableCondition)
DataSourceAutoConfiguration.JdbcTemplateConfiguration#jdbcTemplate matched
- @ConditionalOnMissingBean (types: org.springframework.jdbc.core.JdbcOperations; SearchStrategy: all) found no beans (OnBeanCondition)
DataSourceAutoConfiguration.JdbcTemplateConfiguration#namedParameterJdbcTemplate matched
- @ConditionalOnMissingBean (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; SearchStrategy: all) found no beans (OnBeanCondition)
DataSourceTransactionManagerAutoConfiguration matched
- @ConditionalOnClass classes found: org.springframework.jdbc.core.JdbcTemplate,org.springframework.transaction.PlatformTransactionManager (OnClassCondition)
DataSourceTransactionManagerAutoConfiguration.TransactionManagementConfiguration matched
- @ConditionalOnMissingBean (types: org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration; SearchStrategy: all) found no beans (OnBeanCondition)
H2ConsoleAutoConfiguration matched
- @ConditionalOnClass classes found: org.h2.server.web.WebServlet (OnClassCondition)
- found web application StandardServletEnvironment (OnWebApplicationCondition)
- matched (OnPropertyCondition)
HibernateJpaAutoConfiguration matched
- @ConditionalOnClass classes found: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean,org.springframework.transaction.annotation.EnableTransactionManagement,javax.persistence.EntityManager (OnClassCondition)
- found HibernateEntityManager class (HibernateJpaAutoConfiguration.HibernateEntityManagerCondition)
Negative matches:
-----------------
DataSourceAutoConfiguration.NonEmbeddedConfiguration did not match
- missing supported DataSource (DataSourceAutoConfiguration.NonEmbeddedDataSourceCondition)
`
ОБНОВЛЕНИЕ 2: добавлен привод и просмотр конечной точки /configprops
, Интересно то, что мой конфиг был взят и база данных существует, но когда приложение запускается, оно не использует это dataSource
,
"spring.datasource.CONFIGURATION_PROPERTIES":
{"prefix":"spring.datasource",
"properties":{
"schema":null,
"data":null,
"xa":{"dataSourceClassName":null,
"properties":{}
},
"type":null,
"separator":";",
"url":"jdbc:h2:file:~/test;DB_CLOSE_ON_EXIT=FALSE",
"platform":"all",
"continueOnError":false,
"jndiName":null,
"sqlScriptEncoding":null,
"password":"******",
"name":"testdb",
"driverClassName":"org.h2.Driver",
"initialize":true,
"username":"test"
}
}
6 ответов
См. http://www.h2database.com/html/cheatSheet.html
Я думаю, это может быть проблема с jdbc.url, измените его следующим образом:
# from:
spring.datasource.url=jdbc:h2:file:~/test;DB_CLOSE_ON_EXIT=FALSE
# to:
spring.datasource.url=jdbc:h2:~/test;DB_CLOSE_ON_EXIT=FALSE
Я добавляю этот ответ, чтобы избежать путаницы и дальнейших исследований.
На самом деле у меня та же проблема, и ни один из ответов не сработал для меня полностью, а не сработал набор ответов.
Вот минимальная конфигурация, которая требуется для сохранения H2 db при весенней загрузке.
application.xml
# H2
spring.h2.console.enabled=true
spring.h2.console.path=/h2
# Datasource
spring.datasource.url=jdbc:h2:file:~/spring-boot-h2-db
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.hibernate.ddl-auto=update
Вот spring.jpa.hibernate.ddl-auto=update
делает трюк. Больше ничего не требуется.
Не нужно добавлять spring-boot-starter-jdbc
в pom.xml
Нет необходимости добавлять какой-либо параметр в JDBC URL.
Используя следующую настройку application.properties, мне удается сохранить данные даже после выключения и перезапуска SpringBoot, а также после перезагрузки компьютера.
spring.datasource.name=japodb
spring.datasource.initialize=false
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:file:~/japodb;DB_CLOSE_ON_EXIT=FALSE;IFEXISTS=TRUE;DB_CLOSE_DELAY=-1;
Не закрывайте базу данных при выходе из виртуальной машины, да, но также не создавайте новую базу данных, если она уже есть.
jdbc:h2:<url>;IFEXISTS=TRUE
spring.jpa.hibernate.ddl-auto = update
Вот конфигурация сработала для меня
#File based h2 DB
spring.datasource.url=jdbc:h2:file:C:/temp/test_db;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE;DB_CLOSE_DELAY=-1
#In memory
#spring.datasource.url=jdbc:h2:mem:testdb:security_permission;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.jpa.hibernate.ddl-auto=update
spring.datasource.username=user
spring.datasource.password=admin
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
#Use datasource.initialization-mode if you are configured to use file based h2 and data.sql
spring.datasource.initialization-mode=always
spring.jpa.defer-datasource-initialization=true
Когда я использовал инициализацию данных с помощью data.sql, я должен использовать следующую опцию, чтобы заставить ее работать
spring.datasource.initialization-mode=always
После того, как данные инициализированы, для них можно установить значение «никогда».
spring.datasource.initialization-mode=never
Только что сгенерировал новый проект Spring Boot с start.spring.io с несколькими зависимостями h2, JPA, web, devtools, actuator
, После добавления простого хранилища Entity и Spring Data база данных действительно создается в памяти по умолчанию.
Добавление следующего к моему application.properties
определенно создает файл базы данных в нужном месте:
spring.datasource.url=jdbc:h2:file:~/test;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username=test
spring.datasource.password=test
spring.datasource.driverClassName=org.h2.Driver
Я даже могу подключиться к нему с консоли H2, когда Devtools включен http://localhost:8080/h2-console/
,
Следующим логическим шагом является посещение http://localhost:8080/autoconfig
конечную точку и проверьте состояние автоконфигурации.
В моем случае следующее positiveMatches
:
DataSourceAutoConfiguration.NonEmbeddedConfiguration: [
{
condition: "DataSourceAutoConfiguration.NonEmbeddedDataSourceCondition",
message: "supported DataSource class found"
},
{
condition: "OnBeanCondition",
message: "@ConditionalOnMissingBean (types: javax.sql.DataSource,javax.sql.XADataSource; SearchStrategy: all) found no beans"
}
],
и следующее в negativeMatches
:
DataSourceAutoConfiguration.EmbeddedConfiguration: [
{
condition: "DataSourceAutoConfiguration.EmbeddedDataSourceCondition",
message: "existing non-embedded database detected"
}
],
Не могли бы вы попробовать следующее и проверить отчет автоконфигурации для них?
Создайте файл .h2.server.properties в вашем пути к классам, поместите его ниже и попробуйте снова. Вы можете создать этот файл в папке ресурсов.
#H2 Server Properties
0=H2 File|org.h2.Driver|jdbc\:h2\:file\:~/test;DB_CLOSE_ON_EXIT=FALSE
# Enable if you want other applications to connect
#webAllowOthers=true
#webPort=8082
#webSSL=false