【问题标题】:Java JDBC clearBatch() and heap memoryJava JDBC clearBatch() 和堆内存
【发布时间】:2011-01-09 10:43:55
【问题描述】:

我注意到以下行为。

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

我做的是:

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

最后

commit()

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

【问题讨论】:

  • 这可能很大程度上取决于 JDBC 驱动程序的质量——您使用的是哪一个?
  • 我已从 200 行更改为 10000 行,现在执行时间为 37 秒。看起来使用了相同的尺寸。我正在使用 H2 的 org.h2.jdbcx.JdbcConnectionPool 数据存储为文件..不在内存中。我正在尝试构建一个没有像 oracle、mysql 等数据库服务器的本地应用程序。
  • 您确定高内存使用与数据库处理有关,而不是与导入的文件I/O有关吗?
  • 不,你的权利,最大的内存使用是由于h2数据库......我重写了我的junit以使用oracle,它一直需要大约17/18MB(从开始到结束)。我只是想知道 2MB 和 250K 插入的文件是 17 mb 还是 18 mb 大。我认为使用 h2 减少内存量会很困难,有人建议使用类似的内存使用量更少的东西吗?

标签: java oracle memory jdbc batch-processing


【解决方案1】:

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

编辑:固定语法

【讨论】:

    【解决方案2】:

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

    1. 使用connection.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

    【讨论】:

    • 这不是他描述的他现在所做的,除了使用准备好的语句吗?
    • 部分是的(步骤 1-4)。但是如果失败,第 5 步将允许事务的完全回滚。
    • 回滚与问题无关。
    • OP 声明:“是否有可能降低内存使用量?并具有事务行为(如果一个失败全部失败。)”所以是的,事务的回滚与问题有关。跨度>
    猜你喜欢
    • 2021-09-26
    • 2021-04-28
    • 2011-07-23
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多