HSQLDB: Как создать таблицу с размером, превышающим пространство кучи? - PullRequest
0 голосов
/ 01 октября 2019

Я хочу создать простую таблицу (id INT PRIMARY KEY, value INT) и вставить 16M строк.

Если я использую MySQL, это может занять 128M + данных (фиксированный формат MyISAM).

Теперь яиспользуя HSQLDB и дает только 128M кучи (т.е. работает с -Xmx128m).

Я использую режим файла jdbc:hsqldb:file:..., и вот мой код:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Collections;

import org.hsqldb.jdbc.JDBCDriver;

public class HSQLDBTest {
    private static final int BULK_SIZE = 16384;
    private static final int BATCHES = 1024;

    public static void main(String[] args) throws Exception {
        String sql = "INSERT INTO test (value) VALUES " + String.join(", ", Collections.nCopies(BULK_SIZE, "(?)"));
        try (Connection conn = new JDBCDriver().connect("jdbc:hsqldb:file:test", null)) {
            conn.createStatement().execute("CREATE TABLE test (id INT NOT NULL PRIMARY KEY IDENTITY, value INT DEFAULT 0 NOT NULL)");
            PreparedStatement ps = conn.prepareStatement(sql);
            for (int i = 0; i < BATCHES; i ++) {
                for (int j = 0; j < BULK_SIZE; j ++) {
                    ps.setInt(j + 1, j * j);
                }
                ps.executeUpdate();
                System.out.println(i);
            }
        }
    }
}

Вставка останавливается примерно на0,7M строк (i = 40) и выбрасывает java.sql.SQLException: java.lang.OutOfMemoryError: GC overhead limit exceeded

Есть ли другой режим или свойство, которое может заставить HSQLDB создавать таблицу с размером, превышающим пространство кучи?

1 Ответ

2 голосов
/ 01 октября 2019

Используйте таблицу cached. Если вы не укажете тип таблицы memory предполагается.

create cached table test (...);

Цитата из руководства

CACHED таблицы создаются с помощью CREATE CACHEDКоманда СТОЛ. Только часть их данных или индексов хранится в памяти, что позволяет использовать большие таблицы, которые в противном случае занимали бы до нескольких сотен мегабайт памяти.

...