List patternList=new ArrayList<String>();
ResultSet rs=stat.executeQuery("select file_pattern from Pattern_table");
while(rs.next()){
sourcePattern=rs.getString(1);
patternList.add(sourcePattern);
}
在这里,我将浏览每条记录并添加到list
。遍历ResultSet
并在list
中添加记录需要花费太多时间。
是否有另一种方法可以同时在ResultSet
添加list
的所有记录?
或者我可以遵循任何替代方法来获得更好的表现?
答案 0 :(得分:1)
ResultSet对象维护一个指向其当前行的光标 数据。最初,光标位于第一行之前。该 next方法将光标移动到下一行,因为它返回 当ResultSet对象中没有更多行时,它可以是false 在while循环中用于迭代结果集。
简而言之,即使您找到了直接从结果集中获取列表的方法,它也总是会使用迭代来将其转换为List。
答案 1 :(得分:1)
您可以随时使用Commons DbUtils和MapListHandler。来自doc:
将ResultSet转换为Maps列表的ResultSetHandler实现 所以它会从你手中拿走很多样板代码。 其余部分取决于数据库事务时间。
答案 2 :(得分:1)
在尝试提高Java代码的性能之前,首先尝试从某个SQL客户端运行相同的查询。检查从SQL客户端获取的时间是否等同于Java。
SQL客户端对它们一次获取的行数有默认限制,因此您必须确保已获取查询返回的所有行以测量运行它所花费的时间。
如果您发现SQL客户端的运行速度明显快于Java调用,他们会尝试在fetchSize()
或Statement
上设置Resultset
。
https://docs.oracle.com/cd/A87860_01/doc/java.817/a83724/resltse5.htm
ResultSet
不是查询中的全部数据,而只是其中的一小部分。当你继续运行resultSet.next()
时,它会在先前提取的行用完之后继续获取行。
例如,如果查询返回5000行而fetchSize
为100,那么result.next()
将一次获取100行。只有在读取了这100行之后,才会进行下一次数据库调用,因此JDBC
将对数据库进行5000/100=50
网络调用。
答案 3 :(得分:0)
有many utils用于存档,但性能上的巨大成本全部来自数据库连接和已执行的SQL语句,因此您需要对其进行优化。
答案 4 :(得分:0)
您可以使用方法getArray(String columnLabel)从resultSet获取列值并将其存储在数组中。 然后根据您的要求将其转换为arrayList。 例如:
List patternList=new ArrayList<String>();
ResultSet rs=stat.executeQuery("select file_pattern from Pattern_table");
String[] tempArr = rs.getArray(file_pattern);
patternList = Arrays.asList(tempArr);