public list<t>findavg() {
for(int i=0list){
sum += list[i]
}
avg=sum/list.size()
for(int i=0list){
avg*(1-0.2)<=list[i]<=avg*(1+0.2)
list2.add(list[i])
}
return list2
}
分析你的逻辑应该如下:1、查询表1中符合条件的信息,获取一个结果集合1;
2、基于结果集合1循环,检索表2,获取结果集合2。
如此,如果表1、表2间存在直接关联关系(即直接使用结果集合1中的部分信息作为表2查询的条件),那么完全可以在后台将两张表关联查询,这样避免了通过java进行循环,在大数量级情况下会严重占用内存。
如果表1,表2间没有直接的关联关系(即通过循环表1,判断其中条件后按照其它的特定对照值去查询表2),那么仍然建议使用后台表关联查询,及将表1查询的结果集按照不同的条件获取的值转换成对应的映射值后作为一个基准集合,然后将这个集合与表2关联查询即可。具体的sql语句,得根据你使用的数据库和具体场景去编写。
总之,此类情况,完全可以交由数据库搞定,如果使用你现在的逻辑(即查询表1,循环结果集1,然后查询表2,获取结果集2),虽然原则上没有错,但会增加很多内存开销,在大数据量级的情况下,非常容易出现内存溢出的异常,并不作为合理的编码方式。
不知道你用的什么数据库,我用的是oracle,跟你遇到相同的问题了,不过我写了pl/sql解决了问题,下面是我的代码。在代码里解决的话,最好利用事务处理,在数据库中可以用存储过程。*** 作数据库要分开,可以写两个dao,不过要放在一个service中,可以控制事务。
set serveroutput on
declare
pid number
pname varchar2(50)
begin
pid:=0
loop
pid := pid+1
select name into pname from ptype where id = pid
dbms_output.put_line('这是类别名称'||pname)
update books set ptype=pid where ptype = pname
if pid>=5 then
exit
end if
end loop
end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)