Подтвердить что ты не робот

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

My 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. Я попытался внедрить bean-компонент 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"
        }
    }  
4b9b3361

Ответ 1

Обратитесь к 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

Ответ 2

Я добавляю этот ответ, чтобы избежать путаницы и дальнейших исследований.

На самом деле, у меня та же проблема, и ни один из ответов не сработал для меня полностью, а не сработал набор ответов.

Вот минимальная конфигурация, которая требуется для сохранения H2 db при весенней загрузке.

application.properties

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

Ответ 3

Используя следующий параметр в 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;

Не закрывайте базу данных, когда VM выходит, да, но также не создавайте новую базу данных, если она уже существует.

jdbc:h2:<url>;IFEXISTS=TRUE

spring.jpa.hibernate.ddl-auto = update

Ответ 4

Сгенерирован новый Spring проект загрузки с start.spring.io с несколькими зависимостями h2, JPA, web, devtools, actuator. После добавления простого репозитория данных Entity и Spring база данных действительно создана в памяти по умолчанию.

Добавление следующего в мой 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"
}
],

Не могли бы вы попробовать следующее и проверить отчет автоматической конфигурации для них?

Ответ 5

Создайте файл .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