基于mybatisplus 的 java 异步储存队列

该博客介绍了如何使用MybatisPlus结合Java实现一个异步储存队列,以减少数据库交互带来的性能损耗。通过维护工作线程和保存线程,实现了高并发下的线程优化,避免了线程锁的影响。测试结果显示,相比于逐条储存,使用此队列能显著提升数据存储效率。
摘要由CSDN通过智能技术生成

基于mybatisplus 的 java 异步储存队列
异步储存,减少与数据库之间的交互造成的堵塞使性能下降

import com.baomidou.mybatisplus.extension.service.IService;

import java.util.LinkedList;
import java.util.List;

/**
 * ClassName: MybatisSaveMQ
 * Description: 保存队列
 * date: 2021-03-19
 *
 * @since JDK 1.8
 */

public class MybatisSaveMQ<T> {

    private volatile List<T> list = new LinkedList<>();

    private volatile List<T> saveList ;

    private volatile List<T> cleanList = new LinkedList<>();

    private final IService<T> service;

    private final Class<T> clazz;

    private volatile int threadNum = 0;

    public MybatisSaveMQ(IService<T> service,Class<T> clazz){
        this.service = service;
        this.clazz = clazz;
    }

    public void save(T t){
        this.list.add(t);
        if(threadNum < 3){
            threadNum ++;
            new Thread(){
                @Override
                public void run() {
                    synchronized (clazz){
                        saveList = list;
                        list = cleanList;
                        service.saveBatch(saveList);
                        cleanList = saveList;
                        cleanList.clear();
                        threadNum --;
                    }
                }
            }.start();
        }
    }

}

下面的是线程优化过的,并且增加了异常处理。单独维护一个保存线程,工作线程负责将数据压入队列,保存线程负责将队列中数据存入数据库

import com.baomidou.mybatisplus.extension.service.IService;
import lombok.SneakyThrows;

import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * ClassName: MybatisSaveMQ
 * Description: 保存队列
 * date: 2021-03-19
 *
 * @since JDK 1.8
 */

public class MybatisSaveMQ<T> {

    private volatile List<T> list = new LinkedList<>();

    private volatile List<T> saveList ;

    private volatile List<T> cleanList = new LinkedList<>();

    private final IService<T> service;

    private volatile int threadNum = 0;

    private Thread workTread ;

    private Lock lock = new ReentrantLock();

    private Condition condition = lock.newCondition();

    public MybatisSaveMQ(IService<T> service){
        this.service = service;
        workTread = new Thread(){
            @SneakyThrows
            @Override
            public void run() {
                for (;;){
                    if(threadNum == 0){
                       lock.lock();
                       if(threadNum == 0){
                           condition.await();
                       }
                       lock.unlock();
                    }
                    saveList = list;
                    list = cleanList;
                    try {
                        service.saveBatch(saveList);
                    }catch (Exception e){
                        e.printStackTrace();
                        saveList.forEach(item ->{
                            try {
                                service.save(item);
                            }catch (Exception e1){
                                e1.printStackTrace();
                            }
                        });
                    }
                    cleanList = saveList;
                    cleanList.clear();
                    threadNum --;
                }
            }
        };
        workTread.start();
    }


    public void synchronized save(T t){
        this.list.add(t);
        if(threadNum < 2){
            threadNum ++;
            if(threadNum == 1){
                lock.lock();
                condition.signal();
                lock.unlock();
            }
        }
    }

}

该队列依靠所需工作线程数控制获取线程锁的逻辑,在高并发时没有线程锁的操作,两个线程几乎互不影响,没有性能损耗;
经测试,单纯的依靠mybatisPlus 原生save 方法逐条储存十万条数据到方法结束返回用时 1100多秒,同样的环境下,该队列将同样的数据压入队列并返回的时间为8毫秒,保存线程将数据批量存入数据库的时间为 32 秒

### 回答1: SpringBoot是一个开源的Java开发框架,它简化了Java应用程序的开发流程。MyBatisPlus是一个基于MyBatis的增强工具,它提供了许多便利的功能和特性来简化数据库操作。Vue2是一个流行的JavaScript框架,用于构建用户界面。 要实现SpringBoot、MyBatisPlus和Vue2的登录功能,可以按照以下步骤进行: 1. 创建SpringBoot项目并引入MyBatisPlus和相关依赖。 2. 创建数据库表,包括用户表,可以包含用户名、密码等字段。 3. 创建登录页面,使用Vue2进行前端开发,设计一个简洁且友好的用户界面。 4. 前端页面通过表单提交用户名和密码。 5. 后端接收到登录请求后,从数据库中查询该用户是否存在。 6. 如果用户存在,将用户输入的密码与数据库中的密码进行比较。 7. 如果密码匹配,则返回登录成功的状态信息给前端,同时可以生成一个Token作为用户登录的凭证。 8. 前段接收到登录成功的状态信息后,可以将Token保存在本地,用于后续的用户请求验证。 9. 如果密码不匹配,则返回登录失败的状态信息给前端。 10. 前端接收到登录失败的状态信息后,可以做相应的提示。 这样,就完成了SpringBoot、MyBatisPlus和Vue2登录功能的实现。在实际开发中,还可以结合其他安全机制,如使用Spring Security进行权限控制,保障系统的安全性。 ### 回答2: Spring Boot是一个开源的Java开发框架,可以帮助我们快速构建基于Spring的应用程序。MyBatis Plus则是MyBatis的增强工具,可以简化数据库操作。Vue.js是一个用于构建用户界面的JavaScript框架,可以帮助我们开发单页面应用。 在Spring Boot中集成MyBatis Plus,并结合Vue.js实现登录功能,可以按照以下步骤进行: 1. 创建一个Spring Boot项目,引入MyBatis Plus和Vue.js的相关依赖。 2. 在Spring Boot中配置数据库连接信息,并创建用户表。 3. 创建一个用户实体类,并使用MyBatis Plus的注解进行实体和数据表的映射。 4. 创建一个用户DAO接口,继承MyBatis Plus的BaseMapper接口,用于实现数据库操作。 5. 创建一个用户Service,调用DAO接口的方法进行数据处理。 6. 在Vue.js中创建登录页面,包括输入框和登录按钮。 7. 使用Vue.js发送异步请求,将登录数据传递给Spring Boot后端。 8. 在Spring Boot中编写登录接口,接收前端传递的用户名和密码。 9. 在登录接口中根据用户名和密码查询数据库,判断是否登录成功。 10. 将登录结果返回给前端,并根据结果进行相应的操作,如跳转到首页或者提示登录失败。 以上就是使用Spring Boot、MyBatis Plus和Vue.js实现登录功能的简要步骤。当然,还可以根据具体需求进行更加详细的配置和开发。希望对您有所帮助! ### 回答3: Spring Boot是一个用于构建基于Java的应用程序的开发框架,MyBatis Plus是MyBatis的增强工具,可简化Java数据库的交互过程。Vue2是一个用于构建用户界面的前端框架。 要实现Spring Boot、MyBatis Plus和Vue2的登录功能,可以按照以下步骤进行: 1. 后端开发: - 使用Spring Boot创建一个基本的后端应用程序。 - 配置MyBatis Plus,包括连接到数据库的参数和实体类映射。 - 创建一个用户登录的接口,接收前端传递的用户名和密码参数。 - 在接口中实现登录逻辑,包括验证用户名和密码是否正确,如果正确,则生成一个token作为登录凭证。 - 将token返回给前端。 2. 前端开发: - 使用Vue2创建一个基本的前端应用程序。 - 创建一个登录页面,包括用户名和密码的输入框以及登录按钮。 - 在登录按钮的点击事件中,调用后端的登录接口,传递用户名和密码参数。 - 根据后端返回的token进行相关操作,例如保存token到本地存储、跳转到其他页面等。 总结: 通过Spring Boot提供的后端支持MyBatis Plus简化数据库操作,结合Vue2创建的前端界面,可以实现一个具备登录功能的应用程序。后端负责处理用户认证逻辑,并生成登录凭证token,前端负责接收用户输入的用户名和密码,并将其传递给后端进行验证。登录成功后,可以根据后端返回的token进行相应的操作,例如保存token、跳转到其他页面等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值