파일 기반 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>
문서와 다수의 투고를 통해 알 수 있듯이, 설정은 기능만 할 뿐, 나에게는 전혀 도움이 되지 않습니다.기본적인 오류를 방지하기 위해 다음 사항을 확인했습니다.
- 응용 프로그램 속성이 클래스 공간에 있습니다.
- 주석에서 자동 구성을 제외하려고 했습니다.
@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"
}
}
혼란을 피하고 더 이상의 연구를 하기 위해 이 답변을 덧붙입니다.
사실 저도 같은 문제가 있어서 어떤 답변도 완전히 통하지 않았습니다.몇 가지 답변의 조합이 효과가 있었습니다.
다음으로 스프링부트에서 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에 파라미터를 추가할 필요가 없습니다.
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
'programing' 카테고리의 다른 글
새로운 @angular/cli 버전의 angular-cli.json 파일은 어디에 있습니까? (0) | 2023.03.08 |
---|---|
react-select: 검사기에서 스타일링할 때 드롭다운을 열어두는 방법? (0) | 2023.03.08 |
$resource 요청을 취소하는 방법 (0) | 2023.03.08 |
스프링 보안:Spring Boot 2.7.0에서 사용되지 않는 Web Security Configurer Adapter (0) | 2023.03.08 |
TypeScript에서 반응 상태 사용 (0) | 2023.03.08 |