java - HSQLDB 优化 1.000.000 批量插入

标签 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. 有没有办法在 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/

相关文章:

sql-server-2005 - SQL Server 性能 : derived table vs. 公用表表达式 (CTE)

java - 如何同步文件明智的文件编写器对象?

java - JDBC中使用的java中**Connection接口(interface)**的**prepareStatement**的实现在哪里?

java - Spring : how to get multiple datasource with GenericDao?

java - 启动文件 : <jnlp> 中缺少以下必填字段

java - 我们什么时候应该在方法中抛出异常或捕获异常?

java - 针对 WatchEvent 证明存在的文件获取 FileNotFoundException

java加密还原

performance - redis批量插入时读取redis

MySql 错误 1045 (00000) : Access denied - different MySQL versions