1.问题描述:通过分页加载A表中的数据,每分析完一页,将本页的分析成功的数据id去修改A表中对应id记录的flag标志,表示已经成功分析了。
出现的问题是:假设有11条数据:
核心代码如下:
public static void main(String[] args) {
int totalCount=getGraphRelationDataCount("");//查询需要分析数据的条数
int pageSize=2;//每页条数
int pageTotal=totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1;
for(int page=1;page<=pageTotal;page++){
List<EntityRelation> rrList=getGraphRelationDataByDb(page, pageSize);
updateAnalysisDataFlag(rrList);
System.out.println("第"+page+"页执行完毕!!!");
}
}
查询记录数sql:
select count(id) from st_test where flag!=2
查询每一页数据:
select * from st_test where flag!=2 limit ?,?
修改每一页数据:
String sql="update st_test set flag='2' where id=?";
运行结果是:
Initialize dbcp...
本次分析条数为:11
第1页执行完毕!!!
第2页执行完毕!!!
第3页执行完毕!!!
4连接失效!!!!
第4页执行完毕!!!
5连接失效!!!!
第5页执行完毕!!!
6连接失效!!!!
第6页执行完毕!!!
现象是:总共6页,前3页正常,后3页,从第4页开始,查询不到数据了???
原因在于:初始加载 ,A1 ,B1 ,C1,D1,E1, F1,,H1, I1, J1 , K1, L1 (这里将字段和标志绑定在一起)
flag=2 flag=1
page=1 A2 ,B2 C1,D1,E1, F1,,H1, I1, J1 , K1, L1 (flag=1的集合在发生变化,更新了A1,B1变为A2,B2)
page=2 A2 ,B2 , E2, F2 C1,D1,,H1, I1, J1 , K1, L1 (flag=1的集合在发生变化,更新了E1,F1变为E2,F2)
page=3 A12,B2 , E2, F2 J2, K2 C1,D1,,H1, I1, L1 (flag=1的集合在发生变化,更新了J1,K1变为了J2,K2)
page=4 A2 ,B2 , E2 F2 J2, K2 C1,D1,,H1, I1, L1 (flag=1的集合不再发生变化,limit 6,2,现在只剩下5个元素,找不到元素,所以集合为null)
page =5 。。。。。。。
page=6 。。。。。
根源在于:每更新一页,原来查询的集合会发生变化,重新组合。
2.解决办法如下:
public static void main(String[] args) {
int pageSize=2;//每页条数
int page=1;
while(true){
List<EntityRelation> rrList=getGraphRelationDataByDb(page, pageSize);
if(rrList!=null&&rrList.size()>0){
updateAnalysisDataFlag(rrList);
}
else{
System.out.println("第"+page+"页执行0条,执行完毕!!!");
break;
}
System.out.println("第"+page+"页执行完毕!!!");
page++;
}
}
sql语句:
StringBuffer sb=new StringBuffer();
sb.append("select * from st_test where flag!=2 limit ?,? ");//表示已经分析过test_flg==2
int start=0;
paramList.add(start);
paramList.add(pageSize);