java - Hsqldb - 内存过度使用?

标签 java hsqldb h2

我在服务器内存模式下使用 hsqldb 2.3.2。 我遇到一种情况,我向 hsqldb 插入一些信息,并且 HSQLDB 使用的堆空间(即使在 GC 之后)比我将其保存在 java 堆中的普通 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);
       }
     }

我使用 JVisutalVM 跟踪服务器 HSQLDB 进程并 我运行上面的代码,直到发生 OutOfMemory

我尝试了不同的堆大小并停止了上面的代码 - 令人不安的是我总是看到我插入了大约 13,800,000 行 - 在具有 3GB 可用堆的服务器中 - 并且在终止上面的代码并执行 GC 后堆已满0 堆占用 2500MB -

这意味着每行占用大约 180 个字节 - 单个 long 需要 8 个字节 - 因此重量增加了 22 倍。

这当然只是一项测试,真实的表通常不会只有一个字段 - 但我探索这一点的原因是,当我尝试将 1GB 内存从 oracle 复制到 HSQLDB 时 - 在 HSQLDB 中它最终会保留 4GB ! (表结构相同)

现在,问题是:

  1. 发生什么事了?我的测试看起来正确吗?

  2. 如何减少 HSQLDB 中的内存消耗?

  3. 如果没有简单的方法,其他哪些类似产品可能具有合理的内存使用量? H2 在这种情况下表现如何?

谢谢

最佳答案

最后我选择了 H2,它占据了原始大小的 1.2 左右(在我的例子中)。它还具有额外的内存压缩模式。

关于java - Hsqldb - 内存过度使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22679594/

相关文章:

mysql - 如何最好地从 Java/JDBC 中的 SQL 查询中检索 SELECT COUNT(*) 的结果 - Long?大整数?

给出匹配多列的不同结果的 SQL 查询

java - 如何将H2添加到Wildfly中,以便我可以看到数据库中的数据?

java - JTextArea 不显示在 JTabbedPane 内的 JPanel 上

java - C# 数组索引

java - 撤消 IDatabaseTester setDataSet()

java - 在Tomcat部署之前运行java方法启动数据库

sql - 在 H2 SELECT 查询中首先对 NULL 进行排序

java - 解析带有前缀的K、V数据的最佳方案

java - 在 LinkedList 上实现自定义迭代器