4

我需要尽快在 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. 有没有办法用 MaxPermSize=64m 插入 1.000.000 个条目?
  2. 为什么在这段代码上tomcat 会吃掉这么多内存?有 1.000.000 * 19(“firstName”+“secondName”的长度)*2(1 个符号上的字节)= ~40Mb。
  3. 为什么在内存表中插入比在缓存表中更快?难道我做错了什么 ?
4

1 回答 1

5
  1. 也许试着用更小的套装来做。它将消耗更少的内存,并且可能会更有效。
  2. 计算内存的大小要困难得多。例如,您不会将 firstName 存储 100 万次,该值将被内部化,但您必须存储引用 100 万次。然后,你所有的图书馆都会消耗记忆,等等......
  3. 你把什么叫做“缓存表”?

试试看,你至少会消耗更少的内存:

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();

编辑:你确定是因为烫发尺寸吗?你能把堆栈跟踪吗?

于 2012-11-22T07:54:19.817 回答