gpt4 book ai didi

java - HSQLDB 优化 1.000.000 批量插入

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:20:05 24 4
gpt4 key购买 nike

我需要尽快在 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. 为什么在内存表中插入比在缓存表中快?我做错了什么吗?

最佳答案

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

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

关于java - HSQLDB 优化 1.000.000 批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13507947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com