Как настроить 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>

Насколько я понимаю из документации и ряда постов, конфигурация должна работать, но мне не повезло. Просто, чтобы предотвратить некоторые из основных ошибок, я попробовал и проверил следующее:

  1. Мои свойства приложения находятся в classspath:
  2. Я пытался исключить автоконфигурацию в аннотации @EnableAutoConfiguration
  3. Я пытался ввести 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
Другие вопросы по тегам