java 百万级数据处理_一次性查询百万级数据应该怎么处理?
比如現(xiàn)在有個(gè)需求,一個(gè)統(tǒng)計(jì)站的某張表有百萬行的數(shù)據(jù),需要通過一系列的計(jì)算來再展示到頁(yè)面(不能使用分頁(yè)),計(jì)算可以
跳過,就單純的查詢.如下://long?d1?=?new?Date().getTime();
//List>?result?=?service.findAll("select?*?from?t_hourly_apk_area",null);
//System.out.println(result.size());
//System.out.println(new?Date().getTime()-d1);
這樣查詢非常慢,并且JSP渲染也很慢。
這種情況下我考慮想了兩種辦法,一種是先加載一部分?jǐn)?shù)據(jù),到了JSP再通過AJAX主動(dòng)發(fā)送請(qǐng)求獲取剩余數(shù)據(jù)。
第二種是通過線程,比如數(shù)據(jù)共一百萬,那么我分三個(gè)線程查詢,每個(gè)線程查詢?nèi)f。如下:
class?MyT?extends?Thread{
BaseService?bs;
int?star;
int?size;
public?MyT(BaseService?bs?,?int?star,int?size)?{
this.bs=bs;
this.star=star;
this.size=size;
}
@Override
public?void?run()?{
System.out.println("---------------------------------");
long?d1?=?new?Date().getTime();
List>?x?=?bs.findAll("select?*?from?t_hourly_apk_area?limit?"+star+","+size,null);
System.out.println(x.size()+"?----?"+this.currentThread().getName());
System.out.println(new?Date().getTime()-d1);
System.out.println("");
System.out.println("");
}
}
@RequestMapping(value="/down")
@Controller
public?class?IndexAction?extends?BaseAction{
@RequestMapping(value="/test")
public?String?test(){
//long?d1?=?new?Date().getTime();
//List>?result?=?service.findAll("select?*?from?t_hourly_apk_area",null);
//System.out.println(result.size());
//System.out.println(new?Date().getTime()-d1);
MyT?mt1?=?new?MyT(service,?0,?500000);
MyT?mt2?=?new?MyT(service,?500000,?500000);
MyT?mt3?=?new?MyT(service,?1000000,?600000);
mt1.start();
mt2.start();
mt3.start();
return?null;
}
}
這樣做有個(gè)問題是,線程跑完了數(shù)據(jù)我怎么返回前臺(tái)?
我的核心問題就是想請(qǐng)教下,JAVA一次性請(qǐng)求大量數(shù)據(jù)(不包含分頁(yè)等處理)的時(shí)候應(yīng)該怎么處理!
總結(jié)
以上是生活随笔為你收集整理的java 百万级数据处理_一次性查询百万级数据应该怎么处理?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【微信测试号实战——01】注册一个属于你
- 下一篇: synchronized的偏斜锁,轻量级