JOOQ从大表中获取数据:良好的做法

时间:2016-09-30 14:29:31

标签: java postgresql garbage-collection out-of-memory jooq

我有一个外部api,一个要下载,另一个用于从db表[postgresql]上传数据。表非常大。随着时间的推移,我们观察到缓慢的服务器继续占用内存但不会将其删除太多,并且它会抛出错误并退出[有时linux关闭它]。我检查了内存转储,我无法弄清楚我可以与我的代码相关的任何内容。我没有使用任何本地缓存或类似的东西。但今天我得到了这个 -

java.lang.OutOfMemoryError: GC overhead limit exceeded
        at java.sql.Timestamp.toString(Timestamp.java:350)
        at java.lang.String.valueOf(String.java:2994)
        at org.jooq.impl.AbstractParam.name(AbstractParam.java:107)
        at org.jooq.impl.AbstractParam.<init>(AbstractParam.java:81)
        at org.jooq.impl.AbstractParam.<init>(AbstractParam.java:77)
        at org.jooq.impl.Val.<init>(Val.java:63)
        at org.jooq.impl.DSL.val(DSL.java:15157)
        at org.jooq.impl.Tools.field(Tools.java:1092)
        at org.jooq.impl.Tools.fields(Tools.java:1226)
        at org.jooq.impl.BatchSingle.executePrepared(BatchSingle.java:231)
        at org.jooq.impl.BatchSingle.execute(BatchSingle.java:182)
        at org.jooq.impl.BatchCRUD.executePrepared(BatchCRUD.java:159)
        at org.jooq.impl.BatchCRUD.execute(BatchCRUD.java:100)

对于提取,我使用普通fetch函数并将数据转储到DB中,我使用JOOQ的batchInsertbatchUpdate方法。 JOOQ有什么好的做法来处理大量数据吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

fetch()batchInsert() / batchUpdate()都会缓冲您的内容,即结果和/或绑定变量。使用jOOQ时不建议使用此方法。让我们分别看两个操作:

大读

对于大型读取,您应该避免fetch(),因为这将获取数据库中的所有记录,并在使用它们之前将它们存储在内存中。在大多数情况下,这是比保持开放游标/资源(JDBC的方式)更好的方法,但是在结果很大的情况下,这是令人望而却步的。相反,您应该使用fetchLazy()fetchStream()

// Using fetchLazy():
try (Cursor<Record> cursor = query.fetchLazy()) {
    ...
}

// Using fetchStream():
try (Stream<Record> stream = query.fetchStream()) {
    ...
}

不要忘记使用try-with-resources确保所有资源(例如ResultSetPreparedStatement)在您完成后关闭。

请注意还有ResultQuery.fetchSize(),它允许specifying the JDBC fetch size阻止PostgreSQL JDBC驱动程序缓冲太多行。

大写

您不应该在任何数据库中一次性编写大量插入内容。除了您可能遇到的客户端内存问题之外,还存在与增长UNDO / REDO日志相关的服务器端问题的风险。理想情况下,您应该通过微调将写入分成小块:

  • 批量大小
  • 批量大小
  • 提交大小

jOOQ知道Loader API导入CSV / JSON /数组数据并负责上述微调。这里记录在案:

http://www.jooq.org/doc/latest/manual/sql-execution/importing

相关问题