【发布时间】:2014-10-09 15:50:03
【问题描述】:
所以我有一些使用 JDBC 的 java 代码,使用准备好的语句将数据插入 PostgreSQL 数据库,看起来有点像这样:
PreparedStatement statement = // prep statement
for (int value: values) {
statement.setInt(1, value);
statement.addBatch();
}
statement.executeBatch();
问题是,我偶尔会遇到异常java.lang.OutOfMemoryError: Java heap space。我环顾四周,但找不到任何东西;如何测试语句是否即将耗尽内存以便我可以执行批处理。像这样的:
PreparedStatement statement = // prep statement
for (int value: values) {
statement.setInt(1, value);
statement.addBatch();
if (statement.currentSize() + sizeof(int) > statement.mazSize()) {
statement.executeBatch();
}
}
statement.executeBatch();
感谢您的帮助。
【问题讨论】:
-
您是否正在关闭您创建的所有资源 - 准备好的语句、结果集等?
-
当我批处理语句时,我会查看内存消耗并在
% x == 0之后刷新它们。你可以监控可用的堆空间,但我只是懒惰了。 -
使用较小的批量大小,例如 500 并迭代执行。
-
我假设你之后关闭
statement?那可能是泄漏。是setAutocommit(false), ... commit()还是异常rollback()?很难想象那个OutOfMemoryError。除了你看到我假设的堆栈跟踪的异常。 -
大家好,对不起,我错过了;是的,我确实关闭了资源。这实际上不是代码的样子,它只是一个简化。我的问题更多,过去我只是使用常量来确定批量大小,但我不知道我的代码部署到的目标机器的细节,所以我希望能够应对不同的可用内存量。
标签: java postgresql jdbc prepared-statement