2013-08-10 7 views
4

"메모리 모드"인 H2 데이터베이스의 다음 코드는 연결이 열려 있거나 VM이 실행될 때까지 완벽하게 실행됩니다. 그러나 H2 db는 연결이 닫히거나 VM 종료가 발생할 때 데이터를 손실합니다. 여러 시작 - 종료/온라인 - 오프라인주기에서 데이터를 유지하는 다른 방법이 있습니까?H2 데이터베이스 인 메모리 모드 트랜잭션을 지속하기위한 아이디어가 있습니까?

한 가지 방법은 디스크 및 메모리의 데이터 무결성을 검사하는 백그라운드에서 응용 프로그램과 동기화 프로세스에서 발행 된 DDL과 DML을 추적하여 디스크 기반 복제본을 작성하는 것입니다. 디스크 기반 DML은 매번 시작할 때마다 디스크 데이터를 메모리에 복사 /로드하는 데 소요되는 느린 오버 헤드 + 추가 오버 헤드가있을 수 있지만, 어느 정도까지는 지속성을 유지할 수 있습니다. 에서-memeory 모드 또는 다른 해결 방법과 지속성 문제에 대한 H2에서 제공하는 다른 방법

이 있습니까?

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 

public class H2InMemoryModeTest {   

public static void main(String[] args) 
    { 
     try 
     { 
      Class.forName("org.h2.Driver"); 

      DriverManager.getConnection("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1","sa","sa"); 

      Statement stmt = con.createStatement(); 

      //stmt.executeUpdate("DROP TABLE table1"); 
      stmt.executeUpdate("CREATE TABLE table1 (user varchar(50))"); 
      stmt.executeUpdate("INSERT INTO table1 (user) VALUES ('John')"); 
      stmt.executeUpdate("INSERT INTO table1 (user) VALUES ('Smith')"); 
      ResultSet rs = stmt.executeQuery("SELECT * FROM table1"); 

      while(rs.next()) 
      { 
       String name = rs.getString("user"); 
       System.out.println(name); 
      } 
      stmt.close(); 
      con.close(); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 

친절하게 도움. 감사.

+0

당신이 [큰 캐시]와 [지속 모드] (http://h2database.com/html/features.html#embedded_databases) (HTTP를 사용 할 수 없습니다 생성합니다 : //h2database.com/html/grammar.html#set_cache_size)? 메모리 내 데이터베이스를 유지하는 것과 관련하여 [SCRIPT TO] (http://h2database.com/html/grammar.html#script) 명령을 고려 했습니까? –

+0

대형 캐시는 좋은 옵션이지만 집계 쿼리 나 인덱스가없는 경우 전체 테이블 검색이 필요한 캐시에는 적합하지 않습니다. 명시 적으로 캐싱 인덱스를 추가하는 것도 좋은 전략이 될 것입니다. 스크립트에 유망 보이지만 모든 시스템 고장/전원 차단/아웃의 메모리의 경우 최신 DB 상태로 복구를 극대화하기 위해 DB의주기적인 스냅 샷을 검사 점 동기화와 같은 트리거 할 수 있습니다. 토마스 뮐러는 뭐라 구요? – Dhwanit

답변

3

당신은 large cache으로 persistent mode을 사용할 수 있습니다. '큰'이라는 말은 전체 데이터베이스가 메모리에 들어가는 것을 의미합니다. 그런 식으로도 테이블 스캔은 디스크에서 읽지 않습니다.

당신이 SCRIPT 명령을 사용할 수 있습니다, 메모리 데이터베이스를 유지하려면,하지만 당신은 수동으로 실행해야합니다.

+0

그런데도 캐시 크기를 크게 지정하면 SQL 엔진이 적어도 한 번만 디스크의 해당 부분을 캐시로 이동해야합니다.이 부분은 해당 쿼리를 처리하는 데 필요하며 나중에 데이터는 캐시에 남아있게됩니다. 하지만 내부 캐싱이 어떻게 작동하는지는 여전히 문제입니다. 'X'테이블을 캐시에 보관하기 위해 지속적으로 H2를 명령 할 수 있습니까? 그리고 대한은 "SCRIPT이"그것은 어느 정도의 메모리 모드에 대한 유망 보이지만 그것은 어떤 실패의 경우에 최신에 가까운 시간 데시벨 상태로 복구를 극대화하기 위해 DB의주기적인 스냅 샷을 할 체크 포인트 이벤트처럼 트리거해야합니다. – Dhwanit

+0

"atleast 한 번만 디스크의 해당 부분을 캐시로 이동": 확실히 디스크에서 메모리로 데이터를로드하려면 어떻게해야합니까? 메모리에로드하지 않으려면 변경 사항을 전혀 유지할 필요가 없습니다. "내부 캐싱 작동 방식은 여전히 ​​문제"입니다. 귀하의 질문은 무엇이며, 왜 알아야합니까? –

-1

변화를 spring.datasource.url = JDBC주세요 : H2를 : ~/테스트, MVCC = TRUE; DB_CLOSE_DELAY = -1; MODE = 오라클 이 로컬 시스템의 테스트 데이터 파일을 만듭니다 C : \ 사용자 \ YOURNAME .. 여기 test.mv 파일