簡體   English   中英

從PreparedStatement批處理JDBC中刪除重復項

[英]Remove duplicates from PreparedStatement batch 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();
        }

這個批處理大約有5萬個條目,所以當我執行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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM