一次性查询百万级数据应该怎么处理?

比如现在有个需求,一个统计站的某张表有百万行的数据,需要通过一系列的计算来再展示到页面(不能使用分页),计算可以

跳过,就单纯的查询.如下:

 //		long d1 = new Date().getTime();
//		List<Map<String,Object>> result = service.findAll("select * from t_hourly_apk_area",null);
//		System.out.println(result.size());
//		System.out.println(new Date().getTime()-d1);

      这样查询非常慢,并且JSP渲染也很慢。


     这种情况下我考虑想了两种办法,一种是先加载一部分数据,到了JSP再通过AJAX主动发送请求获取剩余数据。


      第二种是通过线程,比如数据共一百万,那么我分三个线程查询,每个线程查询三十三万。如下:


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<Map<String,Object>> 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<Map<String,Object>> 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;
	}
}

      这样做有个问题是,线程跑完了数据我怎么返回前台?


      我的核心问题就是想请教下,JAVA一次性请求大量数据(不包含分页等处理)的时候应该怎么处理!

Mr_Li_0001
浏览 3561回答 2
2回答

qq_小强_2

如果浏览器可以接收这些数据,你后台用多线程的话 前端用websocket接收吧

qq_小强_2

100w数据不分页你的客户端浏览器展示得出来吗?有点好奇
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java