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()) {// 按照规则生成HUIDhu.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、打开
题外话:之前也做过并发处理,是在表中添加版本,然后去做的处理,具体代码比较久远,暂时不贴了,改天找到再说