我正在进行查询以检索大量ID(整数)。而不是通过ResultSet迭代数百万次并将所有内容逐个复制到ArrayList,有没有办法简单地将所有内容检索为ArrayList?
我知道ResultSet应该被迭代,因为底层实现可能是缓存内容,但在我的情况下,我只需要立即获取所有ID。我知道我可以将FetchSize设置为一个很大的数字,但是我仍然需要逐个检索ID。
澄清:我想要这样做的原因是性能。分析告诉我,数百万次执行ResultSet.next(),ResultSet.getInt()和ArrayList.add()需要相当长的时间。我认为数据库(我使用H2,用Java编写)可能在内存中的某个地方有数组或列表,所以我正在寻找一种方法将它直接复制到我而不是通过ResultSet迭代接口
答案 0 :(得分:17)
使用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;
}
答案 1 :(得分:6)
将代码放入方法中。调用方法非常简单......
脱离我的头顶:
public static List<Integer> readInts(
PreparedStatement statement
) throws SQLException {
ResultSet results = statement.executeQuery();
try {
assert results.getMetaData().getColumnCount() == 1;
List<Integer> ints = new ArrayList<Integer>();
while (results.next()) {
ints.add(Integer.valueOf(results.getInt(1)));
}
return ints;
} finally {
results.close();
}
}
然后将其称为:
List<Integer> ids = readInts(myStatemnet);
完成。
答案 2 :(得分:5)
如果您的问题是性能不佳,请在使用
执行之前调整语句java.sql.Statement.setFetchSize(int)
试验100,1000,10000,..这将避免不必要的往返,这可能是你提到的缓慢的原因。
此外,如果ArrayList.add()必须多次调整内部数组的大小,它可能会很慢,因为它会创建一个新数组并将所有数据复制到那里。请尝试使用LinkedList。