Java JDBC clearBatch() 和堆内存

发布于 2024-08-19 08:28:28 字数 410 浏览 9 评论 0原文

我注意到以下行为。

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

我所做的是:

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

最后

commit()

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

I've noticed the following behavior.

I have a file that is about 3MB containing several thousand rows.
In the rows I split and create prepared statement (about 250 000 statements).

What I do is:

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

at the end

commit()

The memory usage will increase to around 70mb without out of memory error. Is it possible get the memory usage down? and have the transactional behavior (if one fails all fails.).
I was able to lower the memory by doing commit with the executeBatch and clearBatch... but this will cause a partial insert of the total set.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

芯好空 2024-08-26 08:28:28

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

编辑:固定语法

You could insert all rows into a temp table with same structure and if everything is fine. let the database insert them into to target table using: insert into target (select * from temp).
In case the import into the temp table fails you haven't changed anything in you target table.

EDIT: fixed syntax

内心旳酸楚 2024-08-26 08:28:28

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

  1. 使用 connection.setAutoCommit(false) 设置 dbconnection
  2. 使用 statement.addBatch(sql_text_here) 将批次添加到语句中
  3. 批次全部加载后,使用以下命令执行它: statements.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

You could also use the JDBC 2.0 "batch processing" feature.

  1. Set your dbconnection using connection.setAutoCommit(false)
  2. Add batches to your statement using statement.addBatch(sql_text_here)
  3. Once your batches are all loaded, execute it using: statement.executeBatch()
  4. Commit it using connection.commit()
  5. Catch exceptions and rollback as necessary using connection.rollback()

More on exception handling for rollback... here is a typical rollback exception handler:

  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

Read up here: http://java.sun.com/developer/onlineTraining/Database/JDBC20Intro/JDBC20.html#JDBC2015

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文