서버 메모리 모드에서 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! 무슨 일
: 지금 질문
(테이블 구조는 동일하다)? 내 검사가 맞습니까?
어떻게 HSQLDB에서 메모리 소비를 줄일 수 있습니까?
쉬운 방법이없는 경우 다른 유사한 제품이 합리적인 메모리 사용량을 가질 수 있습니까? 이 문맥에서 H2는 어떤가?
필자가 쓴 것처럼 - 실제 인덱싱 된 테이블이있는 실제 사례가 있으며 4-5 배 더 오래 걸립니다. 긴 필드 예제는 그냥 증명할뿐입니다. 마지막으로 나는 원래 크기의 1.2 (내 경우에는)를 차지 H2를 선택했습니다. 또한 메모리에 추가적인 압축 모드가 있습니다. – user967710