簡體   English   中英

字符串鍵不會從 HashMap 中刪除

[英]String key is not removed from HashMap

我有一個數據庫,其中存儲了 url 和它們的 md5 代碼。 我需要檢查來自一組 url 的鏈接是否已經存在於 db 中。 我有以下一段代碼,它在多個線程中運行。 每個tread對應特定的md5 key,即url的md5的前三位:

String[] urls = new String[linksMap.size()];
String[] md5s = new String[linksMap.size()];
boolean expectingMittcom = false;
boolean hadMittcom = false;
int i = 0;
for (String url : linksMap.keySet()) {
  urls[i] = url;
  if (url.equals("http://mittcom.com/")) {
    expectingMittcom = true;
  }
  md5s[i++] = linksMap.get(url).variationMd5;
}

int offset = 0;
while (offset < urls.length) {

  Array arMd5 = pqm.getConnection().createArrayOf("text",
                Arrays.copyOfRange(md5s, offset, Math.min(offset + MAX_NUM,
                urls.length)));
  Array arUrl = pqm.getConnection().createArrayOf("text",
                Arrays.copyOfRange(urls,
                offset, Math.min(offset + MAX_NUM, urls.length)));

  PreparedStatement ps = pqm.getConnection().prepareStatement(
                         "select url from links.links_" + key
                       + " where md5=any(?) and url=any(?)");

  ps.setArray(1, arMd5);
  ps.setArray(2, arUrl);
  ResultSet rs = ps.executeQuery();

  while (rs.next()) {
    String url = rs.getString(1);
    boolean printDebug = false;
    if (url.equals("http://mittcom.com/")) {
      hadMittcom = true;
      printDebug = true;
    }
    LinkVariation r = linksMap.remove(url);
    if (printDebug) {
      logger.info("Link variation: " + r);
    }
    if (r != null) {
      Map<String, String[]> linksMapOriginal = 
           linksByMD5MapOriginal.get(r.original[INDEX_MD5].substring(0, 3));
      if (printDebug) {
        logger.info("will try to fliter out ["
                    + r.original[INDEX_URL] + "]");
      }
      String[] remove = linksMapOriginal.remove(r.original[INDEX_URL]);
      if (remove != null) {
        if (printDebug) {
          logger.info("Filtered mittcom");
          filtered.incrementAndGet();
          checkStillHere();
        }
      } else {
        if (printDebug) {
          logger.info("Did not filter mittcom");
        }
      }
    }
  }

  rs.close();

  ps.close();

  offset += MAX_NUM;
}
if (expectingMittcom) {
  if (hadMittcom) {
    logger.info("was expecting mittcom and found");
  } else {
    logger.info("was expecting mittcom but didn't find");
  }
}

問題是網址“ http://mittcom.com ”(以及其他一些,我只是專門為此進行調試)仍然保留在 linksByMD5MapOriginal hashMap 中。 我可以在日志文件中看到它已被刪除和過濾,但在線程完成運行后它仍然存在! 我不明白它怎么會發生! 我懷疑不同的 hashCode 等有問題,但鍵是純字符串,應該沒有這樣的問題。 我真的很困惑。

在所有踏板完成運行后,我像這樣檢查它:

    for (Map.Entry<String, Map<String, String[]>> entrySet : linksByMD5MapOriginal.entrySet()) {
        String key = entrySet.getKey();
        Map<String, String[]> value = entrySet.getValue();
        if (value.containsKey("http://mittcom.com/")) {
            logger.info("STILL HERE in " + key);
        }
    }

hashMap 初始化如下:

    protected Map<String, Map<String, String[]>> linksByMD5MapOriginal = new TreeMap<>();

...

    linksByMD5MapOriginal.put(md5Key, linksByKeyMap = Collections.synchronizedMap(new TreeMap<String, String[]>()));

這里的TreeMap是為了方便調試,不必排序。 底層hashMap是同步的,並發修改應該沒有問題。 當線程運行時,沒有任何東西添加到 hashMap 中。 另一個奇怪的事情是我不能使用遠程調試器(程序在遠程服務器上運行),因為如果我嘗試這樣做,程序最終會掛起,所以我被迫使用日志打印輸出進行調試。 但這不是我在這里要求的一般問題。 問題是過濾后的 url 仍然掛在 hashMap 中!

抱歉,如果我的問題不清楚,如果有任何后續問題,我會更新我的帖子。 任何幫助將不勝感激。

UPD:日志打印:

[2017-10-04 07:25:57,580] [INFO ] [CheckUnique] [Thread-46229] Link variation: routines.queue.CheckUnique$LinkVariation@3f89fc46
[2017-10-04 07:25:57,580] [INFO ] [CheckUnique] [Thread-46229] will try to fliter out [http://www.mittcom.com/]
[2017-10-04 07:25:57,580] [INFO ] [CheckUnique] [Thread-46229] Filtered mittcom
[2017-10-04 07:25:57,580] [INFO ] [CheckUnique] [Thread-46229] Link variation: null
[2017-10-04 07:25:57,580] [INFO ] [CheckUnique] [Thread-46229] Link variation: null
[2017-10-04 07:25:57,580] [INFO ] [CheckUnique] [Thread-46229] Link variation: null
[2017-10-04 07:25:57,580] [INFO ] [CheckUnique] [Thread-46229] Link variation: null
[2017-10-04 07:25:57,580] [INFO ] [CheckUnique] [Thread-46229] Link variation: null
[2017-10-04 07:25:57,580] [INFO ] [CheckUnique] [Thread-46229] Link variation: null
[2017-10-04 07:25:57,580] [INFO ] [CheckUnique] [Thread-46229] Link variation: null
[2017-10-04 07:25:57,580] [INFO ] [CheckUnique] [Thread-46229] Link variation: null
[2017-10-04 07:25:57,580] [INFO ] [CheckUnique] [Thread-46229] Link variation: null
[2017-10-04 07:25:57,580] [INFO ] [CheckUnique] [Thread-46229] was expecting mittcom and found

...

[2017-10-04 07:46:35,337] [INFO ] [CheckUnique] [main] STILL HERE in cd2

我修復了錯誤,它位於一段與此無關的代碼中。 簡而言之,鏈接變化檢查機制被破壞了。 我可以刪除這個問題嗎?

暫無
暫無

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

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