热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javaweb产品补丁更新技术_JavaWeb并发:FORUPDATE实战,监测并解决。

Writer:BYSocket(泥沙砖瓦浆木匠)一、前言针对并发,老生常谈了。目前一个通用的做法有两种:锁机制:1.悲观锁&

Writer:BYSocket(泥沙砖瓦浆木匠)

一、前言

针对并发,老生常谈了。目前一个通用的做法有两种:锁机制:1.悲观锁;2.乐观锁。

但是这篇我主要用于记录我这次处理的经历,另外希望能看的大神,大牛,技师者,学长,兄长,大哥们能在评论中发表自己的看法和解决技巧等。

二、故事是这样的

一个表,暂且叫 wallet,其中3个字段是 金额。初始值为0,如下图所示:

02c331bd7262c2174b919f8269237d8a.png

然后我们写了一个极为简单的Controller,并写了下面的Service代码:

就简单的通过主键读取到一个对象,注意这个对象是没加锁的。也就是说,所对应的SQL如下:

我这边是MyBiatis,大家应该看得懂的。然后一个增加1 一个减少2 一个增加 3。

三、测试是这样

我用了Web应用压力测试工具:Boom。https://github.com/rakyll/boomGo编写的HTTP(S)负载生成器,ApacheBench(AB)的替代工具。Boom是一个微型程序,能够对Web应用程序进行负载测试。它类似于 Apache Bench ,但在不同的平台上有更好的可用性,安装使用也比较简单。

简单使用方式如下:

所以我就如图进行压力测试,可见这个小工具还挺美的,这里我连接数1000,并发数100:

bc02ad2165ea08afe10f9e9480a671cf.png

可见后台程序报错了。什么错误呢?

原来并发导致update死表了。数据库的数据不用看了肯定是错误的。

四、FOR UPDATE的使用

先补一下其知识:利用select * for update 可以锁表/锁行。自然锁表的压力远大于锁行。所以我们采用锁行。什么时候锁表呢?

假设有个表单products ,里面有id跟name二个栏位,id是主键。

例1: (明确指定主键,并且有此笔资料,row lock)

SELECT * FROM wallet WHERE id=’3′ FOR UPDATE;

例2: (明确指定主键,若查无此笔资料,无lock)

SELECT * FROM wallet WHERE id=’-1′ FOR UPDATE;

例2: (无主键,table lock)

SELECT * FROM wallet WHERE name=’Mouse’ FOR UPDATE;

例3: (主键不明确,table lock)

SELECT * FROM wallet WHERE id<>’3′ FOR UPDATE;

例4: (主键不明确&#xff0c;table lock)

SELECT * FROM wallet WHERE id LIKE ‘3’ FOR UPDATE;

因此我们更新了下Service层的Mapper方法&#xff1a;

所对应的SQL如下&#xff1a;

自然大家可以看到&#xff0c;我这边加了锁&#xff0c;是通过主键锁行。

按着上面的测试连接数1000&#xff0c;并发数100&#xff0c;控制台没报错。

037d48e94a8090c6c2e93fe63fd6bac7.png

数据库结果也是很不错。

e1ddec42dafe61adda82cbd29bc326d9.png

五、加大压力

按着上面的测试连接数5000&#xff0c;并发数350&#xff0c;控制台还是没报错。

4d1b828815aaf404a466fcb0cb4a9541.png

数据库结果却是很出错了&#xff01;&#xff01;&#xff01;

ab1ba8015dbb33d5f4697a6f3b993ff7.png

少update了很多值。为什么呢&#xff1f;

六、jvisualvm 小工具检测&#xff0c;发现Tomcat线程连接数默认不够

然后我用jvisualvm 小工具检测。多测了几次&#xff0c;发现连接数5000&#xff0c;并发数350&#xff0c;并发数上升。有一个图的值始终不变。如图&#xff1a;

83a2ea321c2ab7ab4e755bfc72cdeef3.png

发现图中 tomcat的守护线程一直在200左右。后来我去找了下tomcat的server.xml发现了&#xff0c;使用了默认&#xff0c;大概就是200左右。

所以就配置了一下&#xff0c;大致配置方法有两种如下&#xff1a;

第1种方式&#xff1a;配置Connector

maxThreads&#xff1a;tomcat可用于请求处理的最大线程数

minSpareThreads&#xff1a;tomcat初始线程数&#xff0c;即最小空闲线程数

maxSpareThreads&#xff1a;tomcat最大空闲线程数&#xff0c;超过的会被关闭

acceptCount&#xff1a;当所有可以使用的处理请求的线程数都被使用时&#xff0c;可以放到处理队列中的请求数&#xff0c;超过这个数的请求将不予处理

第2种方式&#xff1a;配置Executor和Connector

name&#xff1a;线程池的名字

class&#xff1a;线程池的类名

namePrefix&#xff1a;线程池中线程的命名前缀

maxThreads&#xff1a;线程池的最大线程数

minSpareThreads&#xff1a;线程池的最小空闲线程数

maxIdleTime&#xff1a;超过最小空闲线程数时&#xff0c;多的线程会等待这个时间长度&#xff0c;然后关闭

threadPriority&#xff1a;线程优先级

maxThreads&#xff1a;线程池的最大线程数&#xff0c;直接配置1000&#xff0c;然后用连接数10000&#xff0c;并发数800测试。轻松见图&#xff1a;

0555ae8f5d6d15012a27a5a21bd064f4.png

5310cc9271a4ea8633cd820e6f803f46.png

七、总结

感谢帮助我的人。希望有大牛在此讨论相关。小生感激不尽。



推荐阅读
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • 本文详细探讨了 org.apache.hadoop.ha.HAServiceTarget 类中的 checkFencingConfigured 方法,包括其功能、应用场景及代码示例。通过实际代码片段,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 离线安装Grafana Cloudera Manager插件并监控CDH集群
    本文详细介绍如何离线安装Cloudera Manager (CM) 插件,并通过Grafana监控CDH集群的健康状况和资源使用情况。该插件利用CM提供的API接口进行数据获取和展示。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • 在Fedora 31上部署PostgreSQL 12
    本文详细介绍如何在Fedora 31操作系统上安装和配置PostgreSQL 12数据库。包括环境准备、安装步骤、配置优化以及安全设置,确保数据库能够稳定运行并提供高效的性能。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
author-avatar
无内功不5功
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有