web-dev-qa-db-ja.com

ファイルベースの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. 注釈@Primary@ConfigurationProperties(prefix = "spring.datasource")の組み合わせでdataSource Beanを挿入し、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"
        }
    }  
54
bitboy

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
28
lenicliu

混乱とさらなる研究を避けるために、この回答を追加しています。

実際、私は同じ問題を抱えており、一部の回答のミックスが機能するのではなく、完全に機能する回答はありませんでした。

以下は、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がトリックを行います。他に何も必要ありません。

pom.xmlにspring-boot-starter-jdbcを追加する必要はありません

jdbc urlにパラメーターを追加する必要はありません。

31
Avinash

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
2
guntarion

いくつかの依存関係h2, JPA, web, devtools, actuatorを持つstart.spring.ioを使用して、まったく新しいSpring Bootプロジェクトを生成しました。単純なエンティティと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

Devtoolsが有効になっている場合、H2コンソールで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"
}
],

以下を試して、それらの自動構成レポートを確認できますか?

0
Brian Clozel