一旦它读取大约30,000个邮政编码,程序就会滞后

时间:2014-05-08 20:18:25

标签: java mysql while-loop

我的程序是匹配Craigslist美国网站,并从美国邮政编码文件中为其分配邮政编码。首先它读取包含美国邮政编码和适当城市的zipcode文件。阅读完每个条目后,它会检查craigslist网站的源代码,以查找该城市的匹配项。如果找到匹配项,程序会将该zipcode分配给该URL,并将URL和zipcde插入mySQL数据库。但是一旦它读取了大约30,000个zipcodes,该程序就会落后很多。

我已经包含了我的代码,用于比较邮政编码,如果找到匹配,则会将其插入数据库:

String sql = "SELECT   city, state FROM CRAIGSLIST";
ResultSet rs = con.createStatement().executeQuery(sql); 

while(rs.next()) {
    String state = rs.getString("state");
    String city = rs.getString("city");
    if((city.equalsIgnoreCase(cityInFile)) && (state.equalsIgnoreCase(stateInFie))){
        sql = "UPDATE CRAIGSLIST "+ " SET zipcode = '"+ZipCode+"' WHERE city = '"+city+"'" ;
        con.createStatement().executeUpdate(sql);
        System.out.println("Found a match!");
        break;                  
    }
}

有人请帮忙。谢谢

3 个答案:

答案 0 :(得分:1)

您可以线性扫描30k记录以查找单个匹配项。

创建一个hashtablemap,其中cityInFile是键,stateInFile是值。然后循环遍历结果集,并根据哈希表检查每个城市。

你正在做O(n ^ 2)工作以找到你的比赛。如果您对文件进行哈希处理,则会将工作减少到O(n),因为您将在固定时间内进行n次搜索。

if hashtable.get(cityInFile).equals(state)
//match found

您可以做的另一个解决方案是遍历您的文件并为每个cityInFile发出单独的查询以检查它是否存在,然后查看状态是否匹配。它只需要你在SQL语句中添加一个where子句。

答案 1 :(得分:0)

可能是您的CRAIGLIST表没有按城市划分的索引,因此当您添加新记录时,性能会下降,因为它必须查看所有记录才能找到该城市。

答案 2 :(得分:0)

不是每次都获取数据库中的所有记录,而是尝试使用SELECT语句中的WHERE子句将结果限制为与城市和州匹配的结果:

  String sql = "SELECT   city, state FROM CRAIGSLIST " +
                 "WHERE UPPER(city) = '" + cityInFile.toUpperCase() +
                 "', UPPER(state) = '" + stateInFile.ToUppderCase + "'";