가능한 한 빨리 Tomcat의 HSQLDB에 1.000.000 개의 항목을 삽입해야하지만이 코드에는 64m (Tomcat의 기본 MaxPermSize)가 충분하지 않아서 "OutOfMemoryError"가 발생합니다 (원하는 경우 기본 설정에 삽입).HSQLDB 최적화 1.000.000 벌크 삽입
connection.setAutoCommit(false);
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO USER (firstName, secondName) VALUES(?,?)");
for (int i = 0; i < 1000000; i++) {
preparedStatement.setString(1, "firstName");
preparedStatement.setString(2, "secondName");
preparedStatement.addBatch();
}
preparedStatement.executeBatch();
connection.commit();
나는 이것을 http://hsqldb.org/doc/2.0/guide/deployment-chapt.html#dec_bulk_operations으로 바꿨다. "SET FILES LOG FALSE"를 설정했지만 도움이되지 않습니다.
- MaxPermSize = 64m 인 1.000.000 항목을 삽입하는 방법이 있습니까?
- 왜이 코드에 tomcat이 많은 메모리를 먹나요? 1.000.000 * 19 ("firstName"+ "secondName"길이) * 2 (1 심볼상의 바이트) = ~ 40MB.
- 왜 메모리 테이블에서 삽입이 더 빨리 캐시 된 테이블로 이동합니까? 내가 뭔가 잘못하고 있는거야?
10000 배치 크기로 삽입 할 수 있습니까? 모든 1M 항목을 1 배치에 삽입해야합니까? – nhahtdh
예 시도했지만 여전히 작동하지 않았습니다. 아무리 많은 배치가 있더라도 상관 없습니다. – mnemosha
'String' 객체의 메모리 점유는 문자열의 길이에 2를 곱한 길이 인 약 40 바이트를 더한 것입니다.이 경우 약 19 (문자열의 길이) + 40 = 각 문자열의 59 바이트, 즉 118 바이트 * 1000000 = ~ 118MB. 그래서 가장 좋은 해결책은 @nhahtdh에 의해 지적 된 바와 같이 더 작은 배치를 사용하는 것입니다. – remigio