java开启多线程同时查询数据库(线程池+redis缓存优化)

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();
至此接口调用一下就可以同时查询出两组数据,时间大大减少
  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值