Java JDBC clearBatch()和堆内存

Java JDBC clearBatch()和堆内存,java,oracle,memory,jdbc,batch-processing,Java,Oracle,Memory,Jdbc,Batch Processing,我注意到以下行为 我有一个大约3MB的文件,包含数千行。 在这些行中,我拆分并创建了大约250000条语句 我所做的是: preparedStatement addBatch do for every 200 rows { executeBatch clearBatch(). } 最后 commit() 内存使用量将增加到70mb左右,而不会出现内存不足错误。有可能降低内存使用率吗?如果一个失败了,那么就有事务性行为。。 我能够通过使用executeBatch和clearBatch进行提

我注意到以下行为

我有一个大约3MB的文件,包含数千行。 在这些行中,我拆分并创建了大约250000条语句

我所做的是:

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

commit()
内存使用量将增加到70mb左右,而不会出现内存不足错误。有可能降低内存使用率吗?如果一个失败了,那么就有事务性行为。。
我能够通过使用executeBatch和clearBatch进行提交来降低内存。。。但这将导致部分插入整个集合。

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


编辑:固定语法

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

使用connection.setAutoCommitfalse设置数据库连接 在此处使用statement.addBatchsql\u text\u将批添加到语句中 加载所有批处理后,使用:statement.executeBatch执行它 使用connection.Commit提交它 捕获异常并根据需要使用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

读到这里:

这不是他描述的他目前除了使用准备好的陈述之外所做的吗?部分是的,步骤1-4。但是,如果事务失败,步骤5将允许事务的完全回滚。回滚与问题无关。OP状态:是否有可能降低内存使用率?如果一个失败了,则具有事务性行为。是的,事务回滚与问题有关。这可能非常依赖于JDBC驱动程序的质量-您使用的是哪一个?我已经从200行更改为10000行,执行时间现在是37秒。看起来使用了相同的尺寸。我使用的是H2的org.H2.jdbcx.JdbcConnectionPool,数据存储为文件。。不在记忆中。我正在尝试构建一个没有oracle、mysql等数据库服务器的本地应用程序。您确定高内存使用率与数据库处理有关,而不是与导入的文件I/O有关吗?没有您的权利,最大内存使用率是由于h2数据库。。。我重写了junit以使用oracle,从开始到结束大约需要17/18MB的时间。我只是想知道如果有2MB和250K插入的文件,17或18MB是否很大。我认为在h2中减少内存量是很困难的,有人建议使用类似的方法来减少内存使用吗?