2014-03-27 3 views
1

서버 메모리 모드에서 hsqldb 2.3.2를 사용하고 있습니다. hsqldb에 몇 가지 정보를 삽입하는 상황이 발생하고 HSQLDB에 의해 사용 된 힙 공간 (GC 이후)이 Java H 힙의 일반 HashMap/LinkedList에 보관 된 것보다 3 ~ 4 정도 더 큽니다.Hsqldb - 메모리 과다 사용?

Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost","sa",""); 
    c.setAutoCommit(false); 
    PreparedStatement ps = c.prepareStatement("set database sql syntax ora true"); 
    ps.execute(); 
    ps.close(); 

    ps = c.prepareStatement("create table t (x long)"); 
    ps.execute(); 
    ps.close(); 
    c.close(); 
    String x = "insert into t values(?)"; 
    c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost","sa",""); 
    c.setAutoCommit(false); 
    ps = c.prepareStatement(x); 
    for(int i=0;i<1000*1000*10000;i++){ 
     long z = new Random().nextLong(); 
     ps.setLong(1, z); 
     ps.addBatch(); 
      if(i%1000==0){ 
      ps.executeBatch(); 
     ps.clearParameters(); 
     ps.clearBatch(); 
     ps.close(); 
     ps = null; 
     ps = c.prepareStatement(x); 
     } 
     c.commit(); 
      c.close();   
     if(i%100000 == 0){ 
     System.out.println(i);//print number of rows inserted 
      c.commit(); 
     c.close(); 
     c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost","sa",""); 
    c.setAutoCommit(false); 
    ps = c.prepareStatement(x); 
     } 
    } 

나는이에서 OutOfMemory가

을 발생했을 때까지 위의 코드를 실행 JVisutalVM 및 를 사용하여 서버 HSQLDB 과정을 추적 : 여기

는 메모리 HSQLDB 서버에 여러 레코드를 삽입 코드 나는 다른 힙 크기를 시도했다 & 나는 위의 코드를 멈췄다. 무엇이 방해 받고 있는가? 내가 항상 13,800,000 개의 행을 삽입했다는 것을 알 수있다. - 3GB의 사용 가능한 힙이있는 서버에서 - 그리고 힙은 위의 코드를 종료하고 GC 0을 수행 한 후에 꽉 찼다. 소요되는 시간은 2500MB -

이는 모든 행이 약 180 바이트를 차지한다는 것을 의미합니다. 단일 long은 8 바이트를 차지하므로 22 시간이 더 무거워집니다.

이것은 물론 테스트와 실제 테이블은 대개 단 하나의 필드 만 가지고 있지 않습니다.하지만 제가 조사한 이유는 oracle에서 HSQLDB로 1GB의 메모리를 복사하려고 할 때였습니다. HSQLDB에서 홀딩을 끝냅니다. 4GB! 무슨 일

  1. : 지금 질문

    (테이블 구조는 동일하다)? 내 검사가 맞습니까?

  2. 어떻게 HSQLDB에서 메모리 소비를 줄일 수 있습니까?

  3. 쉬운 방법이없는 경우 다른 유사한 제품이 합리적인 메모리 사용량을 가질 수 있습니까? 이 문맥에서 H2는 어떤가?

이 관계형 데이터베이스에 대한 적절한 사용의 경우가 아니라 당신

답변

0

마지막으로 H2는 원래 크기 (내 경우에는 약 1.2)를 차지했습니다. 또한 메모리에 추가적인 압축 모드가 있습니다.

-1

감사드립니다. 하나의 열만있는 테이블이 있고 일부 긴 (BIGINT) 값을 저장하고 있습니다. 삽입 한 값을 검색 할 수 있도록 기본 키가 없습니다.

이 용도에는 HashMap도 필요하지 않습니다. 모든 라이브러리에서 HashSet 구현을 사용하면됩니다.

+0

필자가 쓴 것처럼 - 실제 인덱싱 된 테이블이있는 실제 사례가 있으며 4-5 배 더 오래 걸립니다. 긴 필드 예제는 그냥 증명할뿐입니다. 마지막으로 나는 원래 크기의 1.2 (내 경우에는)를 차지 H2를 선택했습니다. 또한 메모리에 추가적인 압축 모드가 있습니다. – user967710