有效查询大型数据库

时间:2017-07-06 01:19:47

标签: java jdbc

我有一个黑名单存储在一个包含大约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();
    }

然而,这需要很长时间才能完成。有没有更有效的方法来实现我的目标?

1 个答案:

答案 0 :(得分:0)

  1. &#34;这需要很长时间才能完成&#34; - 需要很长时间才能完成?如果从数据库客户端控制台运行它,查询需要多长时间?
  2. 您没有提供有关表格中存在哪些索引的任何信息,因此您需要查看这些内容。
  3. setFetchSize是JDBC驱动程序的提示 - 您真的需要一个WHERE子句,您可以在其中限制所获取的记录。 Oracle DB可以使用ROWNUM执行此操作;对于其他数据库,您必须自己寻找。
  4. 那就是说,我同意@ScaryWombat;在内存中保留15亿条记录是不可扩展的设计。另一种方法是通过缓存数据库查找每个域来构建客户端缓存;实际上,缓存的条目数量将少于15亿。