场景描述:抢红包活动,现场700人,每个人必须中奖,中奖活动开始过程中出现宕机;参数(C3P0 100连接数,超时时间30秒;tomcat 连接池4096 ;
JVM内存 1024M 1024M 64M 512M)
处理过程:使用loaderrunning进行性能测试,对数据库连接池数量进行,tomcat线程数,JVM内存进行参数调整,加压测试。
发现问题:
1、 程序宕机是因为有数据库连接未关闭的情况,导致数据库连接没有释放,最终所有线程等待,宕机(出现数据库连接异常)。
2、高并发环境下出现数据藏独现象(两个人同事中了同一个CDKEY),采取了hibernate乐观锁。添加方式如下:
数据库表添加version字段
pojo
private Integer version;
映射文件
添加乐观锁之后出现的新问题就是当两条数据对同一个记录进行操作的时候,只有一个会成功,第二个会抛出异常。场景需要每位用户都必须中奖,在这个基础上做了以下优化:
【java|抢红包性能测试测试案例】1. 每次更新操作,刷新session;
2. 异常数据接到异常在进行处理。
try{
zpList = this.activityService.meetingDoQhbRandom(peActivityId, empno, page, rows);
}catch(Exception e){
try{
Thread.sleep(500);
zpList = this.activityService.meetingDoQhbRandom(peActivityId, empno, page, rows);
}catch(Exception e1){
Thread.sleep(500);
try{
zpList = this.activityService.meetingDoQhbRandom(peActivityId, empno, page, rows);
}catch(Exception e2){
zpList = this.activityService.meetingDoQhbRandom(peActivityId, empno, page, rows);
}
}
}
数据优化了很多,但是还存在不中奖需要重新抽的情况。
后期讨论了两套解决方案:
1 才是缓存或者内存数据库存放cdkey
2 使用代码同步机制,锁住代码块。
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)