热门标签 | 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上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
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社区 版权所有