springboot使用异步查询数据

Posted cq-yangzhou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot使用异步查询数据相关的知识,希望对你有一定的参考价值。

主要适用于需要查询多种类型的数据,而且二者的参数没有关联的情况。

1、开启异步调用注解

技术图片

2、创建抽象类,定义相关方法

技术图片
 1 /**
 2  * @author:YZH
 3  * time: 2019/8/8 12:16
 4  * description: 建立抽象类,定义相关方法
 5  **/
 6 public abstract class BaseAdapt<T,Base>
 7     private Base base;
 8 
 9     public  BaseAdapt(Base base)
10         this.base = base;
11     
12 
13     /**
14      * 查询list数据(默认要实现)
15      * @return
16      */
17     public abstract List<T>list();
18 
19     /**
20      * 查询数量
21      * @return
22      */
23     public  int count()return 0;
24 
25     /**
26      * 返回单个对象V
27      * @return
28      */
29     public T getT()
30         return null;
31     
32 
33 
View Code

3、建立异步调用方法

技术图片
 1 @Component
 2 public  class DemoThread 
 3 
 4 
 5     @Async
 6     public <T,Base> Future<T> getT(BaseAdapt<T,Base>baseAdapt) 
 7         return new AsyncResult<>(baseAdapt.getT());
 8     
 9 
10     @Async
11     public <T,Base> Future<List<T>> list(BaseAdapt<T,Base> baseAdapt)
12         return new AsyncResult<>(baseAdapt.list());
13     
14 
15     @Async
16     public Future<Integer>count(BaseAdapt baseAdapt)
17         return new AsyncResult<>(baseAdapt.count());
18     
19 
View Code

 

4、建立一个dao类,模拟访问数据库

技术图片
 1 @Component
 2 public class UserDao 
 3 
 4     public User getUser()
 5         User user = new User();
 6         user.setName("测试");
 7         user.setId(UUID.randomUUID().toString());
 8         return user;
 9     
10 
11     public List<User>listUser()
12         int num = new Random(1).nextInt(10);
13         System.out.println("随机生成:"+num+"个user");
14         List<User>users = new ArrayList<>(num);
15         for (int i = 0; i < num; i++) 
16             User user = new User();
17             user.setId(UUID.randomUUID().toString());
18             user.setName("测试"+i);
19             users.add(user);
20         
21         return users;
22     
23     public int count()
24         return new Random(1).nextInt(10);
25     
26 
View Code

5、调用

a、只实现默认方法,获取list数据

技术图片
 1     @Test
 2     public void  testAsync() throws InstantiationException, IllegalAccessException, ExecutionException, InterruptedException 
 3         BaseAdapt<User,UserDao>baseAdapt = new BaseAdapt<User, UserDao>(userDao) 
 4             @Override
 5             public List<User> list() 
 6                 return userDao.listUser();
 7             
 8         ;
 9         Future<List<User>> list = demoThread.list(baseAdapt);
10         Future<Integer> count = demoThread.count(baseAdapt);
11         List<User> users = list.get();
12         Integer integer = count.get();
13         System.out.println("总数:"+integer);
14         for (User user : users) 
15             System.out.println(user);
16         
17     
View Code

b、新增查询数量

技术图片
 1 @Test
 2     public void  testAsync() throws InstantiationException, IllegalAccessException, ExecutionException, InterruptedException 
 3         BaseAdapt<User,UserDao>baseAdapt = new BaseAdapt<User, UserDao>(userDao) 
 4             @Override
 5             public List<User> list() 
 6                 return userDao.listUser();
 7             
 8             @Override
 9             public int count() 
10                 return userDao.count();
11             
12         ;
13         Future<List<User>> list = demoThread.list(baseAdapt);
14         Future<Integer> count = demoThread.count(baseAdapt);
15         List<User> users = list.get();
16         Integer integer = count.get();
17         System.out.println("总数:"+integer);
18         for (User user : users) 
19             System.out.println(user);
20         
21     
View Code

 

以上是关于springboot使用异步查询数据的主要内容,如果未能解决你的问题,请参考以下文章

基于SpringBoot+SpringSecurity+mybatis+layui实现的一款权限系统

使用 spring data JPA 异步查询的结果

SpringBoot异步线程,父子线程数据传递的5种方案

springboot2 后台管理系统 springbootplus

SpringBoot异步任务

SpringBoot - 使用Assert校验让业务代码更简洁