java开启多线程同时查询数据库(线程池+redis缓存优化)
程序员文章站
2022-06-24 11:05:19
java多线程查询数据库(线程池)需求介绍:调用接口后一个页面要展示两个列表,而且数据量很大。分析:如果按原始方法进行两次查询再将结果返回当然也是可以的。但是查询时间就是两个查询的和,数据量很小的话推荐此方法。但如果数据量很大,正常情况下SELECT * 的时间很长,而且还是两张表,整体的接口执行时间就很慢,很影响用户体验。所以我们必须进行优化,所以想到用多线程来进行查询,同时开启两个线程来查询数据库,最后时间就很快了。再加上整个列表会进行分页,大数据量的情况下会有很多页数据。由于后面的数据很少会去...
java多线程查询数据库(线程池)
需求介绍:
调用接口后一个页面要展示两个列表,而且数据量很大。
分析:
如果按原始方法进行两次查询再将结果返回当然也是可以的。但是查询时间就是两个查询的和,数据量很小的话推荐此方法。但如果数据量很大,正常情况下SELECT * 的时间很长,而且还是两张表,整体的接口执行时间就很慢,很影响用户体验。所以我们必须进行优化,所以想到用多线程来进行查询,同时开启两个线程来查询数据库,最后时间就很快了。再加上整个列表会进行分页,大数据量的情况下会有很多页数据。由于后面的数据很少会去看到,所以我们可以将前1000条数据放在redis里(redis的读取速度很快很快)。如果真的要看1000条之后的数据在掉接口去查就行了。至于有人说,万一数据变化了怎么办。这里具体看项目需求了,如果说展示的频率不高,可以考虑在特定时间执行定时任务来同步数据就不做演示了,这次主要是线程池技术。
直接上代码:
创建线程池
public class CreateThreadUtil {
private static final int THREAD_POOL_SIZE = 2;//线程数量
public static ThreadPoolExecutor createThread(String guid)//传入一个线程池名字,可随意
{
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
.setNameFormat(guid).build();//创建线程工厂
//创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(THREAD_POOL_SIZE,
THREAD_POOL_SIZE,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(1024),
namedThreadFactory,
new ThreadPoolExecutor.AbortPolicy());
return executor;
}
}
写线程方法
//定义第一个线程方法
Callable getTableDetail = new Callable<List>() {
@Override
public List call() {
String sql = "select * from xxx ";
return jdbcTemplate.queryForList(sql);
}
};
//定义第二个线程方法
Callable getFieldList = new Callable<List<Integer>>() {
@Override
public List call() {
String sql2 = "SELECT * FROM yyy";
return jdbcTemplate.queryForList(sql2);
}
};
//创建线程任务
FutureTask getTableDetailTask = new FutureTask(getTableDetail);
FutureTask getFieldListTask = new FutureTask(getFieldList);
//开启线程
executor.submit(getTableDetailTask);
executor.submit(getFieldListTask);
//优美得关闭线程
executor.shutdown();
至此接口调用一下就可以同时查询出两组数据,时间大大减少
本文地址:https://blog.csdn.net/qq_44772660/article/details/112248726
上一篇: C#实现某一属性值变化时触发事件