整体思路:

1.多用户并发请求后端接口;

2.后端会启动多个线程处理前端的请求,如果并发很大就会对后端数据库造成很大的并发压力;

3.通过 JAVA 队列把用户的并发请求转换为串行批量操作数据库;

4.在 JAVA 应用中设置一个存储所有请求数据的 JAVA 队列(每一个 JAVA 应用进程会有一个这样的队列),进行数据批量入库的线程会从该队列批量获取数据进行入库;

5.在 JAVA 应用中设置一个队列数组,进行数据批量入库的线程会在完成一批入库后,把各针对各请求处理线程的响应数据写入各请求处理线程对应的队列,每个处理请求的线程会使用其中的一个队列获取数据库入库完成后的响应消息;

6.请求处理线程获得数据库入库完成的响应消息后返回响应给前端;

package com.sande.user.thread;import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;public class SyncMap {private static  ConcurrentHashMap<String,BlockingQueue> queueMap = new ConcurrentHashMap<>();public  static  BlockingQueue<String> queue = new ArrayBlockingQueue<String>(100);public static  void  setQueueMap(String uuid,BlockingQueue queue) {queueMap.put(uuid, queue);}public static  BlockingQueue  getQueueMap(String uuid) {return queueMap.get(uuid);}}
package com.sande.user.trade.serviceImpl;import javax.annotation.Resource;
import com.sande.user.thread.SyncMap;@Service(value = "tradeServiceQueueImpl")
public class TradeServiceQueueImpl  {public void addQueue() throws InterruptedException {BlockingQueue<String> queue2 = new ArrayBlockingQueue<String>(3);SyncMap.setQueueMap("queue2", queue2);SyncMap.queue.offer("test addQueue");System.out.println(queue2.take());}}
package com.sande.user.trade.controller;import javax.annotation.Resource;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;import com.sande.user.trade.dao.TradeMessage;
import com.sande.user.trade.service.TradeService;
import com.sande.user.trade.serviceImpl.TradeServiceQueueImpl;@RestController
@RequestMapping(value="/trade")
public class TradeController {@Autowired@Qualifier(value="tradeServiceQueueImpl")private TradeServiceQueueImpl tradeServiceQueue;@RequestMapping(value="/order3",method= {RequestMethod.GET , RequestMethod.POST})public TradeMessage  order3() {String message="test";TradeMessage tradeMessage=null;//tradeMessage = tradeServiceQueue.trade(message);try {tradeServiceQueue.addQueue();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}/* System.out.println("controller uuid:"+ tradeMessage.getUuid());System.out.println("controller message:"+ tradeMessage.getMessage());*/return tradeMessage;//return "完成";}}

应用启动时,自动执行的从队列批量消费消息的后台任务。

逻辑:循环从队列获取数据,假设每100条数据为一个批次,当提取完100条数据后进行批量入库。或者队列中数据不足100条,从队列获取数据返回空时进行批量入库。如果一个批次在队列中一条数据也没获取到就调用队列的 task 方法阻塞线程,等有消息时再唤醒线程。

package com.sande.user.trade.serviceImpl;import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Service;import com.sande.user.thread.SyncMap;@Service
public class QueueServiceImpl implements ApplicationRunner {//public void consumeQueue() {//}@Overridepublic void run(ApplicationArguments args) throws Exception {// TODO Auto-generated method stubString string = new String();try {string =SyncMap.queue.take();SyncMap.getQueueMap("queue2").offer(string);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

使用 JAVA 队列把高并发转为批量串行降低后端并发压力相关推荐

  1. java sync和async区别_GCD中串行、并行与async、sync的区别

    * author:conowen@大钟 * E-mail:conowen@hotmail.com 队列由一个或多个任务组成,当这些任务要开始执行时,系统会分别把他们分配到某个线程上去执行. 串行队列. ...

  2. 并发执行变成串行_大白话Java并发面试问题之Java 8如何优化CAS性能?

    专注于Java领域优质技术,欢迎关注 来自:石杉的架构笔记 一.前言 这篇文章给大家聊一下java并发包下的CAS相关的原子操作,以及Java 8如何改进和优化CAS操作的性能. 因为Atomic系列 ...

  3. 并发执行变成串行_网易Java研发面试官眼中的Java并发——安全性、活跃性、性能...

    一. 安全性问题 线程安全的本质是正确性,而正确性的含义是程序按照预期执行 理论上线程安全的程序,应该要避免出现可见性问题(CPU缓存).原子性问题(线程切换)和有序性问题(编译优化) 需要分析是否存 ...

  4. 并发执行变成串行_一篇讲透如何理解数据库并发控制(纯干货)

    1.数据库并发控制的作用 1.1 事务的概念 在介绍并发控制前,首先需要了解事务.数据库提供了增删改查等几种基础操作,用户可以灵活地组合这几种操作,实现复杂的语义.在很多场景下,用户希望一组操作可以做 ...

  5. 并发执行变成串行_一篇讲透如何理解数据库并发控制

    01数据库并发控制的作用 1.1 事务的概念 在介绍并发控制前,首先需要了解事务.数据库提供了增删改查等几种基础操作,用户可以灵活地组合这几种操作,实现复杂的语义.在很多场景下,用户希望一组操作可以做 ...

  6. 并发执行变成串行_大神浅谈数据库并发控制 锁和 MVCC

    在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制.  如果数据库中的所有事务 ...

  7. java队列处理高并发_Java高并发--消息队列

    Java高并发--消息队列 举个例子:在购物商城下单后,希望购买者能收到短信或者邮件通知.有一种做法时在下单逻辑执行后调用短信发送的API,如果此时服务器响应较慢.短信客户端出现问题等诸多原因购买者不 ...

  8. 深度理解GCD线程死锁,队列,同步和异步,串行和并发

    介绍GCD 可以先看看这个 "并发"指的是程序的结构,"并行"指的是程序运行时的状态 https://blog.csdn.net/sinat_35512245/ ...

  9. 进程、线程、进程池、进程三态、同步、异步、并发、并行、串行

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源:cnblogs.com/songhaixing/p/1 ...

最新文章

  1. Ubuntu12.04配置LAMP 环境
  2. 生成两个表的笛卡尔积
  3. 解决Based on configured schedule, the given trigger ‘triggerGroupName_FREEZE_JOB.triggerName_FREEZE...
  4. 存储器是计算机的记忆装置,存储器(Memory)
  5. python购物程序_Python学习:购物程序
  6. Java:Swing篇,实现JList、JTextArea的自动滚动,实时刷新功能
  7. Java CompletableFuture
  8. t–sql pl–sql_SQL Server处理器性能指标–第4部分–处理器指标有助于更深入的调查和故障排除
  9. [剑指offer] 旋转数组的最小数字
  10. Linux 下java jdk安装
  11. wireshark抓包工具详细说明及操作使用
  12. 【BERT-多标签文本分类实战】之四——数据集预处理
  13. 推荐一款国产免费开源的ERP进销存系统 附带安装详细教程
  14. spss中有关t检验的详细介绍(包含操作过程和结果分析)
  15. 获得中国行政区划接口
  16. 计算机课里的余数是什么,余数
  17. Python爬虫之App爬虫视频下载
  18. Java 移位运算符 >>、<< 、>>是怎样进行运算的?
  19. 更新Android Studio遇到:The supplied javaHome seems to be invalid. I cannot find the java executable.
  20. Jupyter notebook 报错 500 : Internal Server Error的解决方法

热门文章

  1. html投影不播放,投影仪不能播放VCD
  2. Apollo学习笔记(14)混合A*
  3. TOF(Time-of-Flight) Camera介绍
  4. 现代c++:MacOS VSCode配置c++17环境
  5. eclipse新版本Dynamic web project的文件夹组成
  6. 基于单片机的洗碗机控制器
  7. CorelDRAW插件-CPG插件开发-插件类架构-IVGAppPlugin-IVGApplication-CDR插件(三)
  8. C++中using的用法
  9. iPhone诞生以后,从此UI设计行业就迅速发生了翻天覆地的变化!...
  10. 将一个整数转换为32位数据(java实现)