5

我注意到以下行为。

我有一个大约 3MB 的文件,其中包含数千行。在行中,我拆分并创建了准备好的语句(大约 250 000 条语句)。

我要做的是:

preparedStatement
addBatch
do for every 200 rows {
 executeBatch
 clearBatch().
}

在最后

commit()

内存使用量将增加到 70mb 左右,而不会出现内存不足错误。是否有可能降低内存使用量?并具有事务行为(如果一个失败,所有失败。)。executeBatch我可以通过使用and ...进行提交来降低内存,clearBatch但这会导致总集的部分插入。

4

2 回答 2

2

如果一切正常,您可以将所有行插入到具有相同结构的临时表中。让数据库使用以下命令将它们插入到目标表中:insert into target (select * from temp)。如果导入临时表失败,您没有更改目标表中的任何内容。

编辑:固定语法

于 2010-01-26T09:24:44.130 回答
-1

您还可以使用 JDBC 2.0“批处理”功能。

  1. 使用设置您的 dbconnectionconnection.setAutoCommit(false)
  2. 使用将批次添加到您的语句中statement.addBatch(sql_text_here)
  3. 一旦您的批次全部加载完毕,请使用以下命令执行它:statement.executeBatch()
  4. 提交它使用connection.commit()
  5. 根据需要使用捕获异常和回滚connection.rollback()

有关回滚异常处理的更多信息......这是一个典型的回滚异常处理程序:

  catch( BatchUpdateException bue )
  {
    bError = true;
    aiupdateCounts = bue.getUpdateCounts();

    SQLException SQLe = bue;
    while( SQLe != null)
    {
      // do exception stuff

      SQLe = SQLe.getNextException();
    }
  } // end BatchUpdateException catch
  catch( SQLException SQLe )
  {
    ...

  } // end SQLException catch

在这里阅读:http: //java.sun.com/developer/onlineTraining/Database/JDBC20Intro/JDBC20.html#JDBC2015

于 2010-01-26T09:26:19.700 回答