欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-20 22:55:28
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