H2 인메모리 데이터베이스테이블을 찾을 수 없습니다.
URL이 있는 H2 데이터베이스를 가지고 있다."jdbc:h2:test"
를 사용하여 테이블을 만듭니다.CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64));
그런 다음 이 (빈) 테이블에서 모든 항목을 선택합니다.SELECT * FROM PERSON
아직까진 괜찮아
단, URL을 로 변경했을 경우"jdbc:h2:mem:test"
유일한 차이점은 데이터베이스가 메모리에만 있다는 것입니다.이것에 의해,org.h2.jdbc.JdbcSQLException: Table "PERSON" not found; SQL statement: SELECT * FROM PERSON [42102-154]
간단한 걸 놓치고 있는 것 같습니다만, 아무쪼록 도와주시면 감사하겠습니다.
DB_CLOSE_DELAY=-1
hbm2dl은 테이블을 작성한 후 연결을 종료하므로 h2는 해당 테이블을 폐기합니다.
connection-url이 다음과 같이 설정되어 있는 경우
jdbc:h2:mem:test
마지막 연결이 닫히는 순간 데이터베이스의 내용이 손실됩니다.
콘텐츠를 보관하려면 다음과 같이 URL을 구성해야 합니다.
jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
이 경우 h2는 VM이 존속하는 한 콘텐츠를 유지합니다.
세미콜론에 주의해 주세요.;
콜론이 아닌 ( ):
).
[ Features ]페이지의 [인메모리 Databases]섹션을 참조해 주세요.견적 내용:
기본적으로 데이터베이스에 대한 마지막 연결을 닫으면 데이터베이스가 닫힙니다.인메모리 데이터베이스의 경우 이는 콘텐츠가 손실됨을 의미합니다.데이터베이스를 열어두려면
;DB_CLOSE_DELAY=-1
데이터베이스 URL로 이동합니다.가상 시스템이 활성 상태인 동안 메모리 내 데이터베이스의 내용을 유지하려면jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
.
이것은 고객님의 경우가 아니라는 것을 알고 있습니다만, H2가 대문자 이름의 테이블을 작성한 후 대소문자를 구분하여 동작하고 있기 때문에 같은 문제가 있었습니다.이것은 작성 스크립트(작성 스크립트 포함)에서는 모두 소문자를 사용하고 있었습니다.
추가에 의해 해결됨;DATABASE_TO_UPPER=false
접속 URL로 이동합니다.
Spring Boot 2.4+의 경우 application.properties에서 spring.jpa.spring-initialization=true를 사용합니다.
말하기 어렵다.이를 테스트하기 위한 프로그램을 만들었습니다.
package com.gigaspaces.compass;
import org.testng.annotations.Test;
import java.sql.*;
public class H2Test {
@Test
public void testDatabaseNoMem() throws SQLException {
testDatabase("jdbc:h2:test");
}
@Test
public void testDatabaseMem() throws SQLException {
testDatabase("jdbc:h2:mem:test");
}
private void testDatabase(String url) throws SQLException {
Connection connection= DriverManager.getConnection(url);
Statement s=connection.createStatement();
try {
s.execute("DROP TABLE PERSON");
} catch(SQLException sqle) {
System.out.println("Table not found, not dropping");
}
s.execute("CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64))");
PreparedStatement ps=connection.prepareStatement("select * from PERSON");
ResultSet r=ps.executeQuery();
if(r.next()) {
System.out.println("data?");
}
r.close();
ps.close();
s.close();
connection.close();
}
}
테스트는 실패나 예기치 않은 출력 없이 완료되었습니다.어떤 버전의 h2를 실행하고 있습니까?
h2-console을 열 때 JDBC URL은 속성에 지정된 URL과 일치해야 합니다.
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:testdb
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
spring.h2.console.enabled=true
뻔해 보이지만 몇 시간 동안 알아냈는데..
H2 인메모리 데이터베이스는 JVM 내의 메모리에 데이터를 저장합니다.JVM이 종료되면 이 데이터는 손실됩니다.
당신이 하고 있는 것은 아래의 2개의 자바 클래스와 비슷하다고 생각합니다.다음 클래스 중 하나가 테이블을 만들고 다른 하나는 테이블에 삽입하려고 합니다.
import java.sql.*;
public class CreateTable {
public static void main(String[] args) throws Exception {
DriverManager.registerDriver(new org.h2.Driver());
Connection c = DriverManager.getConnection("jdbc:h2:mem:test");
PreparedStatement stmt = c.prepareStatement("CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64))");
stmt.execute();
stmt.close();
c.close();
}
}
그리고.
import java.sql.*;
public class InsertIntoTable {
public static void main(String[] args) throws Exception {
DriverManager.registerDriver(new org.h2.Driver());
Connection c = DriverManager.getConnection("jdbc:h2:mem:test");
PreparedStatement stmt = c.prepareStatement("INSERT INTO PERSON (ID, FIRSTNAME, LASTNAME) VALUES (1, 'John', 'Doe')");
stmt.execute();
stmt.close();
c.close();
}
}
이러한 클래스를 차례로 실행했을 때, 다음과 같은 출력이 나왔습니다.
C:\사용자\Luke\stuff>java CreateTable C:\사용자\Luke\stuff>java InsertIntoTable스레드 "main" org.h2.jdbc에 예외가 있습니다.Jdbc SQLException:테이블 "Person"을 찾을 수 없습니다. SQL 문: 개인(ID, 이름, 성) 값(1, 'John', 'Doe') [42102-154]org.h2.message로 이동합니다.DbException.getJdbcSQLException(DbException.java:327)org.h2.message로 이동합니다.DbException.get(DbException.java:167)org.h2.message로 이동합니다.DbException.get(DbException.java:144)...
번째가 되는 대로java
exits, " "에 의해 된 테이블"CreateTable
더 이상 존재하지 않습니다.InsertIntoTable 클클intointointo 。
을 「」로 때.jdbc:h2:test
그런 오류는 없다는 것을 알았습니다., 파일 「 」이 있는 것을 했습니다.test.h2.db
가 찾을수 있도록 있었습니다.H2가 테이블을 보관하고 있는 장소이며 디스크에 저장되어 있기 때문에 InsertIntoTable 클래스가 찾을 수 있도록 테이블이 남아 있었습니다.
추가하려고 했습니다.
jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
하지만 그것은 도움이 되지 않았다.H2 사이트에서는 다음과 같은 정보를 얻을 수 있었습니다.그것은 경우에 따라서는 도움이 될 수 있습니다.
기본적으로 데이터베이스에 대한 마지막 연결을 닫으면 데이터베이스가 닫힙니다.인메모리 데이터베이스의 경우 이는 콘텐츠가 손실됨을 의미합니다.데이터베이스를 열어두려면 데이터베이스 URL에 ;DB_CLOSE_DELAY=-1을 추가합니다.가상 시스템이 활성 상태인 동안 메모리 내 데이터베이스의 컨텐츠를 유지하려면 jdbc:h2:mem:test;DB_CLOSE_DELAY=-1을 사용합니다.
그러나 제 문제는 스키마로 되어 기본이 다를 것이었다.그래서 사용insted
JDBC URL: jdbc:h2:mem:test
제가 사용하셨다.
JDBC URL: jdbc:h2:mem:testdb
그리고 테이블이 보였다.
, 명시적으로 시험 dbase를 만들기 위해 지정하여 새로운 src/test/resources 폴더+삽입 application.properties 파일을 만들어:과제다.
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create
나는 application-test.properties에 저는 구성을 바꾸었다: 같은 문제가 있었다.
#Test Properties
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create-drop
그리고 나의 의존성:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.198</version>
<scope>test</scope>
</dependency>
그리고, 모두 열왕기 주석 시험 등급에:사용된다.
@RunWith(SpringRunner.class)
@DataJpaTest
@ActiveProfiles("test")
public class CommentServicesIntegrationTests {
...
}
나는 식사 메타 데이터를 가져오기 위해지만 다음과 같은 오차:노력하고 있었다.
사용:
String JDBC_URL = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1";
DatabaseMetaData metaData = connection.getMetaData();
...
metaData.getColumns(...);
빈 ResultSet번.
하지만 다음과 같은 URL을 사용하여 대신 제대로: 일했다.
String JDBC_URL = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false";
다음을 지정해야 합니다. DATABASE_TO_UPER=false
추가해 보았습니다.;DATABASE_TO_UPPER=false
했지만, 은 「Trick」(트릭은 「Trick」입니다.;CASE_INSENSITIVE_IDENTIFIERS=TRUE
.
마지막에는 다음과 같은 일이 있었습니다.jdbc:h2:mem:testdb;CASE_INSENSITIVE_IDENTIFIERS=TRUE
제가 '', '', '', '로 업그레이드 했을 때 문제가 있었어요.Spring Boot 2.4.1
.
저는 같은 오류가 있어서 이 게시물에 왔습니다.
제 경우 데이터베이스의 진화가 실행되지 않았기 때문에 테이블은 전혀 없었습니다.
문제는 진화 스크립트의 폴더 구조가 잘못되었다는 것입니다.
출처 : https://www.playframework.com/documentation/2.0/Evolutions
Play는 여러 진화 스크립트를 사용하여 데이터베이스 진화를 추적합니다.이러한 스크립트는 일반 이전 SQL로 작성되며 애플리케이션의 conf/evolutions/{database name} 디렉토리에 있어야 합니다.진화가 기본 데이터베이스에 적용되는 경우 이 경로는 conf/evolutions/default입니다.
저는 conf/evolutions.default라는 폴더를 만들었습니다.폴더 구조를 conf/evolutions/default로 수정한 후 문제가 사라졌습니다.
똑같은 문제가 있었고, 위의 모든 것을 시도했지만 성공하지 못했다.이 오류의 재미있는 원인은 DB 테이블이 생성되기 전에 JVM이 너무 빨리 시작되었기 때문입니다(src.main.resources의 data.sql 파일을 사용).그래서 스레드를 넣었습니다.sleep(1000) 타이머를 사용하여 "select * from person"을 호출할 때까지 1초만 기다립니다.지금은 완벽하게 일하고 있다.
application.properties:
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
data.sql:
create table person
(
id integer not null,
name varchar(255) not null,
location varchar(255),
birth_date timestamp,
primary key(id)
);
insert into person values (
10001, 'Tofu', 'home', sysdate()
);
Person JdbcDAO.java:
public List<Person> findAllPersons(){
return jdbcTemplate.query("select * from person",
new BeanPropertyRowMapper<Person>(Person.class));
}
메인 클래스:
Thread.sleep(1000);
logger.info("All users -> {}", dao.findAllPersons());
위의 솔루션을 사용해 보았습니다만, 콘솔에 제시된 바와 같이 DB_CLOSE_ON_EX 속성이 추가되었습니다.IT=FALSE, 문제를 해결했습니다.
spring.datasource.url=jdbc:h2:mem:testdb;DATABASE_TO_UPPER=false;DB_CLOSE_ON_EXIT=FALSE
<bean id="benchmarkDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
Spring Data JPA의 종속성을 추가한 후 작동한다는 것을 알게 되었습니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
application.yml에 H2 DB 구성 추가 -
spring:
datasource:
driverClassName: org.h2.Driver
initialization-mode: always
username: sa
password: ''
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
h2:
console:
enabled: true
path: /h2
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: none
jpa가 테이블 구조를 작성하기 전에 데이터를 삽입하려고 하기 때문에 이 문제를 해결하려면 application.properties에 다음 행을 삽입해야 합니다.
spring.jpa.defer-datasource-initialization=true
jpa 테스트 중에 테이블 누락 오류가 발생한 경우 schem.sql 파일로 테이블이 생성되어 puting@org.springframework.transaction.an 이후 문제가 해결되었습니다.테스트 시 트랜잭션
파티에 조금 늦을지도 모르지만, 같은 에러에 직면해서, 여기나 데이타베이스등의 다른 Web 사이트에서 거의 모든 해결책을 시도했습니다.TO_UPER=false;DB_CLOSE_DELAY=-1; DB_CLOSE_ON_EXIT=FALSE; IGNORGCASE=TRUE
하지만 난 아무 것도 안 통했어.제게 효과가 있었던 건 데이터 이름을 바꾸는 거였어요.sql을 Import합니다.sql
여기서 찾았습니다 - https://stackoverflow.com/a/53179547/8219358
또는
Spring Boot 2.4+의 경우 application.properties에서 spring.jpa.spring-initialization=true를 사용합니다(여기서 언급 - https://stackoverflow.com/a/68086707/8219358)).
다른 해결책이 더 논리적이라는 것은 알지만, 어느 것도 나에게 효과가 없었고, 이것은 효과가 있었다.
저의 경우 테이블 내의 컬럼 이름에 H2 Database라는 특별한 키워드를 사용했습니다.서로 다른 데이터베이스를 사용하는 경우, 서로 다른 데이터베이스 간에 이러한 특수 키워드를 사용하지 마십시오.Spring & Hibernate는 어떤 컬럼 이름이 금지되어 있는지 또는 테이블 생성에서 오류가 정확히 어디에 있는지를 정확하게 알려줄 만큼 스마트하지 않습니다.다음과 같은 키워드
설명, 간격, 메트릭
발생한 문제를 해결하기 위해 필드 이름을 다음과 같이 변경했습니다.
descr, time_filename, time_filename
http://www.h2database.com/html/advanced.html
Use the same in applications.properties file
spring.jpa.show-sql=true
spring.datasource.url=jdbc:h2:mem:testdb;DATABASE_TO_UPPER=false
DB_CLOSE_ON_EXIT=FALSE
spring.data.jpa.repositories.bootstrap-mode=default
spring.h2.console.enabled=true spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create
spring.datasource.driverClassName=org.h2.Driver
spring.jpa.defer-datasource-initialization=true
언급URL : https://stackoverflow.com/questions/5763747/h2-in-memory-database-table-not-found
'programing' 카테고리의 다른 글
정수를 포함하는 ArrayList를 원시 int 배열로 변환하는 방법 (0) | 2022.07.05 |
---|---|
malloc: ** 오류: 해방된 객체의 체크섬이 잘못됨 - 해방된 후 객체가 수정되었을 수 있습니다. (0) | 2022.07.05 |
Java 클래스 경로 내의 디렉토리에 있는 모든 jar 포함 (0) | 2022.07.05 |
켄도 그리드(Vuex Store 포함), VueJs (0) | 2022.07.05 |
nuxt.diamic - css 배경 이미지를 동적으로 설정하는 방법 (0) | 2022.07.05 |