我有一个黑名单存储在一个包含大约15亿条记录的表中。我的目标是将记录加载到HashSet中,以便我的程序稍后可以检查域名是否被列入黑名单(这不是程序的整个功能,只是一个部分)。我目前有以下代码来加载记录:
HashSet<String> list = new HashSet<String>();
try {
Statement stmt = conn.createStatement();
stmt.setFetchSize(100000000);
try {
ResultSet rs = stmt.executeQuery("SELECT DNname FROM " + table);
try {
while (rs.next()) {
list.add(rs.getString(1));
}
} finally {
rs.close();
}
} finally {
stmt.close();
}
} catch (SQLException e) {
System.out.println("Error loading blacklist from DB");
e.printStackTrace();
}
然而,这需要很长时间才能完成。有没有更有效的方法来实现我的目标?
答案 0 :(得分:0)
setFetchSize
是JDBC驱动程序的提示 - 您真的需要一个WHERE
子句,您可以在其中限制所获取的记录。 Oracle DB可以使用ROWNUM
执行此操作;对于其他数据库,您必须自己寻找。那就是说,我同意@ScaryWombat;在内存中保留15亿条记录是不可扩展的设计。另一种方法是通过缓存数据库查找每个域来构建客户端缓存;实际上,缓存的条目数量将少于15亿。