当前位置:  开发笔记 > 编程语言 > 正文

如何将JDBC ResultSet检索为ArrayList?

如何解决《如何将JDBCResultSet检索为ArrayList?》经验,为你挑选了3个好方法。

我正在进行查询以检索大量ID(整数).而不是通过ResultSet迭代数百万次并将所有内容一个一个地复制到ArrayList,有没有办法简单地将所有内容检索为ArrayList?

我理解ResultSet应该被迭代,因为底层实现可能是缓存内容,但在我的情况下,我只需要立即获取所有ID.我知道我可以将FetchSize设置为一个很大的数字,但是我仍然需要逐个检索ID.

澄清:我想这样做的原因是表现.分析告诉我,数百万次执行ResultSet.next(),ResultSet.getInt()和ArrayList.add()需要相当长的时间.我认为数据库(我使用H2,用Java编写)可能在内存中的某个地方有数组或列表,所以我正在寻找一种方法将它直接复制到我而不是通过ResultSet迭代接口.



1> Mark..:

使用Apache DbUtils库,您可以轻松地将ResultSet作为地图列表返回.

public List query(String query) {
    List result = null;
    try {
        QueryRunner qrun = new QueryRunner();
        result = (List) qrun.query(connection, query, new MapListHandler());
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return result;
}



2> Tom Hawtin -..:

将代码放在一个方法中.调用方法非常简单......

脱离我的头顶:

public static List readInts(
     PreparedStatement statement
) throws SQLException {
     ResultSet results = statement.executeQuery();
     try {
         assert results.getMetaData().getColumnCount() == 1;

         List ints = new ArrayList();
         while (results.next()) {
             ints.add(Integer.valueOf(results.getInt(1)));
         }
         return ints;
     } finally {
         results.close();
     }
}

然后将其称为:

List ids = readInts(myStatemnet);

完成.


这无助于您仍在循环数据的性能.我相信他只是想抛弃它.

3> Antonio..:

如果您的问题是性能不佳,请在执行之前调整语句

java.sql.Statement.setFetchSize(int)

试验100,1000,10000,..这将避免不必要的往返,这可能是你提到的缓慢的原因.

此外,如果ArrayList.add()必须多次调整内部数组的大小,它可能会很慢,因为它会创建一个新数组并将所有数据复制到那里.请尝试使用LinkedList.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有