HSQLDB优化1.000.000批量插入

时间:2012-11-22 07:44:56

标签: java performance jdbc hsqldb

我需要尽快在Tomcat上的HSQLDB中插入1.000.000个条目,但64m(Tomcat上的默认MaxPermSize)对于此代码来说还不够,我得到“OutOfMemoryError”(我想在默认设置中插入)。

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”但它没有帮助。

  1. 有没有办法插入1000,000条MaxPermSize = 64m的条目?
  2. 为什么这段代码tomcat吃了这么多内存?有1.000.000 * 19(“firstName”+“secondName”的长度)* 2(1个符号上的字节数)= ~40Mb。
  3. 为什么在内存表中插入比在缓存表中更快?我做错了吗?

1 个答案:

答案 0 :(得分:4)

  1. 也许尝试用较小的套装来做。它会消耗更少的内存,可能会更有效率。
  2. 计算内存的大小要困难得多。例如,您不会将firstName存储100万次,该值将被内化,但您必须存储该参考100万次。然后,你的所有图书馆都会消耗记忆等......
  3. 你怎么称呼“缓存表”?
  4. 尝试一下,至少会消耗更少的内存:

    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();
        if(i % 1000 == 0)
             preparedStatement.executeBatch();
    }
    preparedStatement.executeBatch();
    connection.commit();
    
    编辑:你确定这是因为烫发的大小吗?你能把堆栈跟踪吗?