繁体   English   中英

JOOQ从大表中获取数据:良好实践

[英]JOOQ fetching data from large table : good practise

我有一个外部api,一个用于下载,另一个用于从db表上传数据和向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中,我使用batchInsertbatchInsertbatchUpdate方法。 JOOQ是否有处理大量数据的良好实践? 我想念什么吗?

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() ,它允许指定JDBC提取大小以防止PostgreSQL JDBC驱动程序也缓冲太多行。

大写

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

  • 散装尺寸
  • 批量
  • 提交大小

jOOQ知道Loader API可以导入CSV / JSON / array数据并进行上述微调。 它记录在这里:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM