将结果集转换成List时,遇到一个莫名其妙的错误:
ResultSetMetaData md = (ResultSetMetaData)rs.getMetaData();
int columnCount = md.getColumnCount();
while(rs.next()){
Map<String,Object>map = new HashMap<String,Object>();
for(int i =1;i<=coulmnCount;i++){
map.put(md.getColumnName(i),rs.getObject(i));
}
list.add(map);
}
先后排查了以下原因:
1.System.gc();
注释掉后,依然报错,说明主动调用回收机制并没有误关结果集。
2.查看是否在其他地方关闭了resultset.
并没有。
3.分析是否在resultset遍历完后在其他地方使用了这个resultset。
并没有。
百度了下,大家将结果集转换成List的办法基本都是这样,单线程情况下没看到出错的例子。
回过头想一想,难道是rs本身为空?这样的话,使用while(rs.next())肯定会出错。
那么有两种办法可以解决这个问题:
1.结果集设置成可滚动的,先使用if(rs.next())判断结果集是否为空。为空的情况就不需要再处理了;不为空,则需要使用rs.previous()将游标回位,再使用while(rs.next())去处理。
缺点是可滚动的结果集会将结果集返回的记录全部加载到内