热门标签 | 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

七、总结

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



推荐阅读
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • ScrollView嵌套Collectionview无痕衔接四向滚动,支持自定义TitleView
    本文介绍了如何实现ScrollView嵌套Collectionview无痕衔接四向滚动,并支持自定义TitleView。通过使用MainScrollView作为最底层,headView作为上部分,TitleView作为中间部分,Collectionview作为下面部分,实现了滚动效果。同时还介绍了使用runtime拦截_notifyDidScroll方法来实现滚动代理的方法。具体实现代码可以在github地址中找到。 ... [详细]
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社区 版权所有