需求中需要查询多个SQL结果,且这些结果间没有相互联系。
正常情况下使用串行的方式进行查询,所消耗的时间为所有SQL查询的时间之和,
但是使用并行的方式进行查询,即多线程查询,所消耗的时间为查询最久SQL的时间。
此处使用callable + furtherTask 方式实现
Callable<List<Map<String, String>>> mainCall = new Callable<List<Map<String, String>>>(){
@Override
public List<Map<String, String>> call() throws Exception {
//创建DBConnection,可以创建在外部,但需要使用final关键字
DBConnection dbc = DataSource.getDBConnection("odsm");
//平台封装方法,创建查询,此处注意需要每次new一个DBQuery,否则仍然是串行执行,
//猜测一个DBQuery同一时间只能执行一个查询,此处DBQuery仅针对我个人使用的平台。
DBQuery dbq = new DBQuery(dbc);
//查询结果存储在list内
List<Map<String, String>> list = dbq.query("TEMP_WY.queryMain", map);
//返回查询结果
return list;
}
};
创建一个FutureTask用于存放查询后的结果,在Thread执行后通过get获取
FutureTask<List<Map<String, String>>> mainFuture = new FutureTask<List<Map<String, String>>>(mainCall);
new Thread(mainFuture).start();
//FutureTask的get方法是线程阻塞的,必须要等待线程都执行完成后,才能获取到结果
List<Map<String, String>> mainList = mainFuture.get();
以上是一个线程的创建、执行、获取方法。
多个线程即重复以上定义即可。
另外建议根据SQL查询来放置线程顺序,我有两个线程都涉及复杂的查询,且用到同几个表:关联、子查询、汇总等,原来将两个放在7与8的位置,导致同一时间同一资源占用较大,通常第8个查询需要20s才能让出结果,将两个一个放在第一个线程执行,一个放在最后一个线程执行,虽然是并发执行,但执行速度明显加快。