lack——主页前后端开发优化(精华:java多线程实现数据插入)

lack------主页前后端开发优化

前端开发主页

  1. 最容易的方式:list列表

    js 复制代码
    <template>
      <van-card
          v-for="user in props.userList"
          :desc="user.profile"
          :title="`${user.username} (${user.planetCode})`"
          :thumb="user.avatarUrl"
      >
        <template #tags>
          <van-tag plain type="danger" v-for="tag in user.tags" style="margin-right: 8px; margin-top: 8px">
            {{ tag }}</van-tag>
        </template>
        <template #footer>
          <van-button size="mini">联系我</van-button>
        </template>
      </van-card>
    </template>
    
    <script setup lang="ts">
    import {UserType} from "../models/user";
    
    interface UserCardListProps{
      userList:UserType[];
    }
    
    const props = withDefaults(defineProps<UserCardListProps>(),{
     // @ts-ignore
      userList:[] as UserType[],
    });
    
    </script>
    
    <style scoped>
    
    </style>

后端接口开发(精华:java多线程实现数据插入)

  1. 对接主页接口开发

    java 复制代码
     /**
     * 首页推荐接口
     * @param request
     * @return
     */
    @GetMapping("/recommend")
    public BaseResponse<List<User>> recommendUsers(HttpServletRequest request) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        List<User> userList = userService.list(queryWrapper);
        List<User> list = userList.stream().map(user -> userService.getSafetyUser(user)).collect(Collectors.toList());
        return ResultUtils.success(list);
    }
  2. 优化对接主页接口开发(分页查询)

    java 复制代码
    /**
     * 首页推荐接口(分页查询)
     * @param request
     * @return
     */
    @GetMapping("/recommend")
    public BaseResponse<Page<User>> recommendUsers(long pageSize,long pageNum,HttpServletRequest request) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        Page<User> userList = userService.page(new Page<>(pageNum,pageSize),queryWrapper);
        return ResultUtils.success(userList);
    }
  3. 模拟大量用户状态

    • 导入用户数据方式
      1. 可视化界面导入
      2. 执行sql语句
      3. 写程序:使用for循环,可以分批导入(保证可控性)。
        1. 编写一次性任务批量插入(for循环插入数据问题:建立释放连接,for循环是绝对线性的)

          java 复制代码
          @Component //成为spring bean
          public class InsertUsers {
          
          @Resource
          private UserMapper userMapper;
          @Resource
          private UserService userService;
          
          public void doInsertUser(){
          StopWatch stopWatch = new StopWatch();
          stopWatch.start();
          final int INSERT_NUM = 1000;
          List<User> userList = new ArrayList<>();
          for (int i = 0; i < INSERT_NUM; i++) {
              User user = new User();
              user.setUsername("假二哈");
              user.setUserAccount("FakeErha");
              user.setAvatarUrl("https://tse4-mm.cn.bing.net/th/id/OIP-C.DMY4H6Xibxdrzf-hkElvZgHaDu?w=326&h=176&c=7&r=0&o=5&pid=1.7");
              user.setGender(0);
              user.setUserPassword("12345678");
              user.setPhone("13987496799");
              user.setEmail("13987496799@qq.com");
              user.setUserStatus(0);
              user.setUserRole(0);
              user.setPlanetCode("1111111");
              user.setTags("[]");
              userList.add(user);
          
          }
          userService.saveBatch(userList,100);
          stopWatch.stop();
          System.out.println(stopWatch.getTotalTimeMillis()); }
          }
        2. 并发要注意执行的前后顺序无所谓,不要用到非并发类的集合如list

          java 复制代码
          /**
           * 自定义线程池
           * 参数含义:默认多少线程池,最大多少,线程存活时间,线程单位,任务队列
           */
          private ExecutorService executorService = new ThreadPoolExecutor(60,1000, 10000,TimeUnit.MINUTES,new ArrayBlockingQueue<>(10000));
          /**
           * 并发批量插入数据
           */
          public void doConcurrencyInsertUser(){
              StopWatch stopWatch = new StopWatch();
              stopWatch.start();
              int batchSize = 5000;
              //10万条数据分成10组每组1万条
              int j = 0;
              List<CompletableFuture<Void>> futuresList = new ArrayList<>();
               for (int i = 0; i <20; i++) {
                  List<User> userList = Collections.synchronizedList(new ArrayList<>());
                  while (true) {
                      j++;
                      User user = new User();
                      user.setUsername("假二哈呀");
                      user.setUserAccount("FakeErha");
                      user.setAvatarUrl("https://tse4-mm.cn.bing.net/th/id/OIP-C.DMY4H6Xibxdrzf-hkElvZgHaDu?w=326&h=176&c=7&r=0&o=5&pid=1.7");
                      user.setGender(0);
                      user.setUserPassword("12345678");
                      user.setPhone("13987496799");
                      user.setEmail("13987496799@qq.com");
                      user.setUserStatus(0);
                      user.setUserRole(0);
                      user.setPlanetCode("1111111");
                      user.setTags("[]");
                      userList.add(user);
                      if (j % batchSize == 0) {
                          break;
                      }
                  }
                  //新建一个异步的任务,不要返回值,使用此方法里面的操作就是异步的
                  CompletableFuture<Void> feature = CompletableFuture.runAsync(() -> {
                      System.out.println("ThreadName:" + Thread.currentThread().getName());
                      userService.saveBatch(userList, batchSize);
                  },executorService);
                  futuresList.add(feature);
              }
               CompletableFuture.allOf(futuresList.toArray(new CompletableFuture[]{ }));
              stopWatch.stop();
              System.out.println(stopWatch.getTotalTimeMillis());
          
          }

效果展示

相关推荐
全栈开发帅帅9 分钟前
基于springboot+vue实现的博物馆游客预约系统 (源码+L文+ppt)4-127
java·spring boot·后端
LeonNo1112 分钟前
golang , chan学习
开发语言·学习·golang
上海拔俗网络20 分钟前
“AI应急管理系统:未来城市安全的守护者
java·团队开发
2401_8582861125 分钟前
109.【C语言】数据结构之求二叉树的高度
c语言·开发语言·数据结构·算法
天之涯上上27 分钟前
JAVA开发Erp时日志报错:SQL 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 ‘***‘ 中的标识列插入显式值
java·开发语言·sql
m0_7482370528 分钟前
web的五个Observer API
java·前端·javascript
南宫生32 分钟前
力扣-数据结构-1【算法学习day.72】
java·数据结构·学习·算法·leetcode
666和77737 分钟前
C#的单元测试
开发语言·单元测试·c#
小王爱吃月亮糖43 分钟前
QT开发【常用控件1】-Layouts & Spacers
开发语言·前端·c++·qt·visual studio
aworkholic1 小时前
opencv sdk for java中提示无stiching模块接口的问题
java·c++·opencv·jni·opencv4android·stiching