programing

H2 인메모리 데이터베이스테이블을 찾을 수 없습니다.

goodcopy 2022. 7. 5. 23:04
반응형

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

이 경우 h2VM이 존속하는 한 콘텐츠를 유지합니다.

세미콜론에 주의해 주세요.;콜론이 아닌 ( ):).

[ 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)...

번째가 되는 대로javaexits, " "에 의해 된 테이블"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

반응형