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();
至此接口调用一下就可以同时查询出两组数据,时间大大减少
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐