Java JDBC clearBatch()和堆内存

时间:2010-01-26 08:58:19

标签: java oracle memory jdbc batch-processing

我注意到以下行为。

我有一个大约3MB的文件,包含几千行。 在我拆分的行中创建预备语句(大约250 000条语句)。

我的工作是:

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

最后

commit()

内存使用量将增加到70mb左右,不会出现内存不足错误。是否有可能降低内存使用率?并且具有事务行为(如果一个失败则全部失败。)。 通过使用executeBatchclearBatch进行提交,我能够降低内存...但这会导致部分插入总计。

2 个答案:

答案 0 :(得分:2)

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

编辑:修正语法

答案 1 :(得分:-1)

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

  1. 使用connection.setAutoCommit(false)
  2. 设置您的数据库连接
  3. 使用statement.addBatch(sql_text_here)
  4. 将批量添加到您的对帐单
  5. 批量加载后,请使用以下命令执行:statement.executeBatch()
  6. 使用connection.commit()
  7. 提交
  8. 使用connection.rollback()
  9. 根据需要捕获例外和回滚

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

      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