java - 从PreparedStatement批处理JDBC中删除重复项

标签 java sql postgresql jdbc

我需要使用一个批处理来更新表。 这批数据正在由我无法更改的算法填充。 但它正在做这样的事情:

String updateFilter = "UPDATE payload_roas SET filtered = TRUE WHERE asn = ? AND prefix= ? AND max_length = ?";
PreparedStatement ps=  connection.prepareStatement(updateFilter);

            for(int i = 0; i < roas.size(); i++) {
               roa = roas.get(i);
               ps.setLong(1, roa.getAsn());
               ps.setObject(2, roa.getPrefix(), OTHER);
               ps.setInt(3, roa.getMax_length());
               ps.setBoolean(4, roa.isWhitelist);
               ps.setBoolean(5, roa.isFilter);
               ps.addBatch();
        }

这个批处理相当大,大约有 50K 条目。因此,当我执行executeBatch 时,它会花费很多时间,这并不奇怪。 然而,这个 ps 包含大量重复项,这意味着它正在进行多次冗余更新。有没有办法对此批处理执行不同的操作以删除这些重复项?

最佳答案

你可以尝试做这样的事情:

String updateFilter = "UPDATE payload_roas SET filtered = TRUE WHERE asn = ? AND prefix= ? AND max_length = ?";
PreparedStatement ps=  connection.prepareStatement(updateFilter);
HashSet<String> hashKeys = new HashSet<>();
for(int i = 0; i < roas.size(); i++) {
    roa = roas.get(i);
    String key = roa.getAsn() + roa.getPrefix().toString() + roa.getMax_length() + roa.isWhitelist + roa.isFilter;
    if (!hashKeys.contains(key)) {
        hashKeys.add(key);
        ps.setLong(1, roa.getAsn());
        ps.setObject(2, roa.getPrefix(), OTHER);
        ps.setInt(3, roa.getMax_length());
        ps.setBoolean(4, roa.isWhitelist);
        ps.setBoolean(5, roa.isFilter);
        ps.addBatch();
    }
}

关于java - 从PreparedStatement批处理JDBC中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48126719/

相关文章:

java - 如何使不同ip的http请求相同的url?

sql - 了解 SQL 中的 NOT EXISTS

postgresql - Informix to Postgres,连续数据复制算法

java - 我可以使用其他泛型类参数的父类(super class)中的泛型类参数作为方法参数吗

java - Spark 将一个 Dataframe 映射到另一个 Dataframe

java - JVM 规范中 JSR/RET 的状态

mysql - 在mysql中获取每个子表的10个项目

mysql - 如何用sql比较两个表的数据?

java - 删除在 PgAdmin 3 中工作但在 Java JDBC 上不起作用的查询

sql - PostgreSQL 中的相关 SERIAL 列