HSQLDB:如何创建一个大小大于堆空间的表?

Posted

技术标签:

【中文标题】HSQLDB:如何创建一个大小大于堆空间的表?【英文标题】:HSQLDB: How to create a table with size larger than heap space? 【发布时间】:2019-10-01 13:55:04 【问题描述】:

我想创建一个简单的表 (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】:

使用cached 表。如果不指定表类型,则假定为memory

create cached table test (...);

引用from the manual

CACHED 表是使用 CREATE CACHED TABLE 命令创建的。只有部分数据或索引保存在内存中,从而允许占用数百兆内存的大型表。

【讨论】:

以上是关于HSQLDB:如何创建一个大小大于堆空间的表?的主要内容,如果未能解决你的问题,请参考以下文章

如何知道 hsqldb 内存数据库的最大大小

2017.3.23

JVM内存分配

如何收缩表空间

JVM之堆空间

jvm调优 - 堆空间各区域大小如何划分配置?