programing

파일 기반 H2 데이터베이스를 사용하도록 스프링 부트를 구성하는 방법

lastmoon 2023. 3. 8. 21:45
반응형

파일 기반 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. 응용 프로그램 속성이 클래스 공간에 있습니다.
  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"
        }
    }  

혼란을 피하고 더 이상의 연구를 하기 위해 이 답변을 덧붙입니다.

사실 저도 같은 문제가 있어서 어떤 답변도 완전히 통하지 않았습니다.몇 가지 답변의 조합이 효과가 있었습니다.

다음으로 스프링부트에서 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-jdbcpom.xml로

jdbc URL에 파라미터를 추가할 필요가 없습니다.

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

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

다음은 나에게 적합한 구성입니다.

#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

데이터가 초기화되면 never로 설정할 수 있습니다.

spring.datasource.initialization-mode=never

가지 종속성이 있는 start을 사용하여 했습니다.io에서 몇 가지 종속성을 가진 새로운 스프링 부트 프로젝트를 방금 생성했습니다.h2, JPA, web, devtools, actuator단순한 엔티티 및 스프링 데이터 저장소를 추가하면 데이터베이스는 기본적으로 메모리에 생성됩니다.

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

할 수 .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

언급URL : https://stackoverflow.com/questions/37903105/how-to-configure-spring-boot-to-use-file-based-h2-database

반응형