场景描述:抢红包活动,现场700人,每个人必须中奖,中奖活动开始过程中出现宕机;参数(C3P0 100连接数,超时时间30秒;tomcat 连接池4096 ;JVM内存 1024M 1024M 64M 512M)
处理过程:使用loaderrunning进行性能测试,对数据库连接池数量进行,tomcat线程数,JVM内存进行参数调整,加压测试。
发现问题:
1、 程序宕机是因为有数据库连接未关闭的情况,导致数据库连接没有释放,最终所有线程等待,宕机(出现数据库连接异常)。
2、高并发环境下出现数据藏独现象(两个人同事中了同一个CDKEY),采取了hibernate乐观锁。添加方式如下:
数据库表添加version字段
pojo
private Integer version;
映射文件
<class name="com.hxjr.pojo.Cdkey" table="CDKEY" <strong>optimistic-lock="version" </strong>>
<id name="id" type="java.lang.String">
<column name="ID" length="40" />
<generator class="uuid.hex" />
</id>
<!-- version标签用于指定表示版本号的字段信息 -->
<strong><version name="version" column="version" type="integer"></version> </strong>
添加乐观锁之后出现的新问题就是当两条数据对同一个记录进行操作的时候,只有一个会成功,第二个会抛出异常。场景需要每位用户都必须中奖,在这个基础上做了以下优化:
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 使用代码同步机制,锁住代码块。 |