【多线程】Java实现多线程查询数据库并返回值

需求中需要查询多个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才能让出结果,将两个一个放在第一个线程执行,一个放在最后一个线程执行,虽然是并发执行,但执行速度明显加快。

原创文章 88 获赞 41 访问量 16万+

猜你喜欢

转载自blog.csdn.net/Damionew/article/details/103564156