gpt4 book ai didi

java - JOOQ 从大表 : good practise 取数据

转载 作者:行者123 更新时间:2023-11-29 12:57:23 24 4
gpt4 key购买 nike

我有一个外部 api,一个用于下载,另一个用于从数据库表 [postgresql] 上传数据。 table 很大。随着时间的推移,我们观察到服务器缓慢地继续占用内存但不会删除太多内存,它会抛出错误并退出 [有时 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 函数,为了将数据转储到数据库中,我使用JOOQ 的batchInsertbatchUpdate 方法。 JOOQ 有什么好的做法来处理大量数据吗?我错过了什么吗?

最佳答案

fetch()batchInsert()/batchUpdate() 都会缓冲您的内容,即您的结果和/或绑定(bind)变量。使用 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/array 数据并负责上述微调。它记录在这里:

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

关于java - JOOQ 从大表 : good practise 取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39793911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com