您现在的位置是:主页 > news > 小型门户网站有哪些/企业推广策划

小型门户网站有哪些/企业推广策划

admin2025/6/5 4:29:47news

简介小型门户网站有哪些,企业推广策划,wordpress 电台,asp.net网站制作实例文章目录场景正文想直接看怎么解决的直接跳转正文即可场景 今天本来准备写一个增加和修改,当存在这条数据,就修改,不存在这条数据就新建一条 代码如下, 不细细的写了,稍微粗略的来一点,有那个意思就行 /**…

小型门户网站有哪些,企业推广策划,wordpress 电台,asp.net网站制作实例文章目录场景正文想直接看怎么解决的直接跳转正文即可场景 今天本来准备写一个增加和修改,当存在这条数据,就修改,不存在这条数据就新建一条 代码如下, 不细细的写了,稍微粗略的来一点,有那个意思就行 /**…

文章目录

      • 场景
      • 正文

想直接看怎么解决的直接跳转正文即可

场景

今天本来准备写一个增加和修改,当存在这条数据,就修改,不存在这条数据就新建一条
代码如下, 不细细的写了,稍微粗略的来一点,有那个意思就行

 /*** 保存课程播放记录更新学习记录** @param courseLearnFlow 课程学习记录明细*/@Transactional(rollbackFor = Exception.class)public void saveFlowAndUpdateRecord(CourseLearnFlow courseLearnFlow) {CoursePlayRecord userCatalogPlayRecord = coursePlayRecordBiz.findUserCatalogPlayRecord(courseLearnFlow.getUserId(), courseLearnFlow.getBuyCourseId(), courseLearnFlow.getCourseId(), courseLearnFlow.getCatalogId());CoursePlayRecord catalogPlayRecord = new CoursePlayRecord();if (ObjectUtils.isNotEmpty(userCatalogPlayRecord)) {catalogPlayRecord.setUserId(courseLearnFlow.getUserId());catalogPlayRecord.setId(userCatalogPlayRecord.getId());// 拼接字符串,更新(CoursePlayRecord)StringBuilder sql = new StringBuilder("id =");sql.append(catalogPlayRecord.getId());sql.append(" and userId = ");sql.append(courseLearnFlow.getUserId());// 更新播放记录coursePlayRecordBiz.updateByWhereSql(catalogPlayRecord, sql.toString());} else {catalogPlayRecord.setUserId(courseLearnFlow.getUserId());// 保存播放记录coursePlayRecordBiz.save(catalogPlayRecord);}}

但是我发现我如果我在非常短的时间内调用两次这个方法,就会产生两条记录,因为两个线程几乎同时执行,系统无法判断是否生成形容新的数据,这时候就得使用锁了,我选择了比较简单的synchronized,主要是因为简单,然后我就把这整个方法都锁上,但是后来我又觉得这么锁的话,锁的颗粒好像有点大,然后我就决定根据userId也就是用户id来加锁

 /*** 保存课程播放记录更新学习记录** @param courseLearnFlow 课程学习记录明细*/@Transactional(rollbackFor = Exception.class)public void saveFlowAndUpdateRecord(CourseLearnFlow courseLearnFlow) {CoursePlayRecord userCatalogPlayRecord = coursePlayRecordBiz.findUserCatalogPlayRecord(courseLearnFlow.getUserId(), courseLearnFlow.getBuyCourseId(), courseLearnFlow.getCourseId(), courseLearnFlow.getCatalogId());CoursePlayRecord catalogPlayRecord = new CoursePlayRecord();synchronized(courseLearnFlow.getUserId()){if (ObjectUtils.isNotEmpty(userCatalogPlayRecord)) {catalogPlayRecord.setUserId(courseLearnFlow.getUserId());catalogPlayRecord.setId(userCatalogPlayRecord.getId());// 拼接字符串,更新(CoursePlayRecord)StringBuilder sql = new StringBuilder("id =");sql.append(catalogPlayRecord.getId());sql.append(" and userId = ");sql.append(courseLearnFlow.getUserId());// 更新播放记录coursePlayRecordBiz.updateByWhereSql(catalogPlayRecord, sql.toString());} else {catalogPlayRecord.setUserId(courseLearnFlow.getUserId());// 保存播放记录coursePlayRecordBiz.save(catalogPlayRecord);}}}

正文

方法一
但是运行起来好像是锁不住,debug了一下看了一下,因为userId是Intefer类型的所以每次获取到的userId的地址值都是不一样的,所以根本没法锁。
然后我就想到了把Integer类型转换成String类型来使用,后来一弄还是不行,然后研究了研究发现好像新建的String类型是在堆中的,并不是在字符串常量池,这个时候我就想到了使用intern()方法,使其返回字符串常量池中的地址,然后就成功的锁住了

 /*** 保存课程播放记录更新学习记录** @param courseLearnFlow 课程学习记录明细*/@Transactional(rollbackFor = Exception.class)public void saveFlowAndUpdateRecord(CourseLearnFlow courseLearnFlow) {CoursePlayRecord userCatalogPlayRecord = coursePlayRecordBiz.findUserCatalogPlayRecord(courseLearnFlow.getUserId(), courseLearnFlow.getBuyCourseId(), courseLearnFlow.getCourseId(), courseLearnFlow.getCatalogId());CoursePlayRecord catalogPlayRecord = new CoursePlayRecord();synchronized(String.ValueOf(courseLearnFlow.getUserId()).intern()){if (ObjectUtils.isNotEmpty(userCatalogPlayRecord)) {catalogPlayRecord.setUserId(courseLearnFlow.getUserId());catalogPlayRecord.setId(userCatalogPlayRecord.getId());// 拼接字符串,更新(CoursePlayRecord)StringBuilder sql = new StringBuilder("id =");sql.append(catalogPlayRecord.getId());sql.append(" and userId = ");sql.append(courseLearnFlow.getUserId());// 更新播放记录coursePlayRecordBiz.updateByWhereSql(catalogPlayRecord, sql.toString());} else {catalogPlayRecord.setUserId(courseLearnFlow.getUserId());// 保存播放记录coursePlayRecordBiz.save(catalogPlayRecord);}}}

方法二
其实还有一种方法,就是用Integer的valueof方法,但是这个方法只能在[-128, 127]这个范围使用,这个范围内使用的话,返回的Integer类型的地址是也是相同的,由于我此处的UserId已经远远超出了这个超出这个范围,所以返回的地址值不同,所以说也就锁不住。

 /*** 保存课程播放记录更新学习记录** @param courseLearnFlow 课程学习记录明细*/@Transactional(rollbackFor = Exception.class)public void saveFlowAndUpdateRecord(CourseLearnFlow courseLearnFlow) {CoursePlayRecord userCatalogPlayRecord = coursePlayRecordBiz.findUserCatalogPlayRecord(courseLearnFlow.getUserId(), courseLearnFlow.getBuyCourseId(), courseLearnFlow.getCourseId(), courseLearnFlow.getCatalogId());CoursePlayRecord catalogPlayRecord = new CoursePlayRecord();synchronized(Integer.valueOf(courseLearnFlow.getUserId())){if (ObjectUtils.isNotEmpty(userCatalogPlayRecord)) {catalogPlayRecord.setUserId(courseLearnFlow.getUserId());catalogPlayRecord.setId(userCatalogPlayRecord.getId());// 拼接字符串,更新(CoursePlayRecord)StringBuilder sql = new StringBuilder("id =");sql.append(catalogPlayRecord.getId());sql.append(" and userId = ");sql.append(courseLearnFlow.getUserId());// 更新播放记录coursePlayRecordBiz.updateByWhereSql(catalogPlayRecord, sql.toString());} else {catalogPlayRecord.setUserId(courseLearnFlow.getUserId());// 保存播放记录coursePlayRecordBiz.save(catalogPlayRecord);}}}

ok,就这么多,毕竟是新手,如果有说的不对的,希望大家多多指教。