Java并发处理
问题描述:项目中业务编号出现重复编号
生成编号规则:获取数据库表最大值,然后再做+1处理,即为新编号(因为起始值是不固定的,还存在‘字符+数据’格式,做了字典项可配置,所以不能直接数据库设置自增)
额外说明此处可以优化:新增一张记录最大值表,每次新增将编号最大值保存到记录最大值表,获取业务表最大值,就从记录最大值表获取,业务数据量上来了,也优化性能
导致并发的代码:
解决方案
1、添加synchronized同步锁
2、锁表
此处是两者都添加了,本来打算添加synchronized就可以了,但是因为该项目是2台服务器独立部署,还是不能避免并发重复编号问题,最后考虑加上锁表
Service层
/**
* 保存hu时添加同步锁
* @param huVo
* @param hu
*/
private synchronized void saveHu(HuVo huVo, TtHu hu) {
this.ttHuDao.huLock();
if (null == huVo.getId()) {
// 按照规则生成HUID
hu.setHuid(AutoGenerateUtil.getNewHuId(this.ttHuDao.getHuMaxHuId()));
hu.setStatus(HuStatus.PACKAGED.getCode());
hu.setEpilStatus(EpilStatus.NOT_CREATED.getCode());
hu.setCreateBy(UserUtils.getUser());
hu.setCreateTime(new Date());
hu.setDeleteMark(Const.NO);
} else {
hu.setUpdateBy(UserUtils.getUser());
hu.setUpdateTime(new Date());
}
this.ttHuDao.save(hu);
}
Dao层
@Query(value = "SELECT * FROM tt_lock with(tablockx) WHERE lock_name = 'hu_lock'", nativeQuery = true)
String huLock();
并发测试工具:apache-jmeter-5.6.3
额外说明:postman不能测试并发,runner是串行的
1、下载apache-jmeter-5.6.3压缩包
2、解压
3、打开
题外话:之前也做过并发处理,是在表中添加版本,然后去做的处理,具体代码比较久远,暂时不贴了,改天找到再说