论坛首页 Java企业应用论坛

数据同步问题,如何解决大数据用户下数据准确性

浏览 5106 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2016-04-01   最后修改:2016-04-01

之前采用了synchronized 保持数据同步,前期确实达到了数据同步准确性的要求

但后期大数据用户下访问变慢,出现卡顿的现象。麻烦帮代码优化,或提供好的方法解决数据同步问题。

 

public synchronized UserTaskVO saveOpenRob(int taskId, String mobile) {
		//任务信息【不加同步,该信息取到后有可能已经被修改了。】
		TaskVO task = rtaskDAO.findTaskById(taskId);

		int now = Integer.parseInt(new DateTime().toString("HHmm"));
		int start = Integer.parseInt(task.getStartTime().replace(":", ""));
		int end = (start + 100) > 2359 ? 2359 : (start + 100);

		//用户任务记录
		UserTaskVO userTask = rtaskDAO.findUserTaskToday(task.getId(), mobile);

		if (userTask != null && userTask.getTaskStatus() == 2) {

			int count = rtaskDAO.queryOpenCount(task.getId());

			if (now > end || count >= task.getBagNum()) {// 无剩余红包、延迟拆
				userTask.setFlowSize(0);
				userTask.setSeq(0);
				userTask.setTaskStatus(3);
				userTask.setPresent("来晚了,红包被抢走了");
				rtaskDAO.updateUserTask(userTask);
			} else {
				//更新任务信息、用户任务记录
				saveProcess(task, userTask);
			}
		}
		return userTask;
	}

 

 

 

   发表时间:2016-04-02  
可以考虑把锁放在数据库层,比在代码加同步效率高点
加一个表保存:任务id、已经领取数、最大领取数
有请求过来的时候直接更新这个表的已领取数

update tasknum set usedCount = usedCount + 1 where taskId = 1 and usedCount <= maxCount;


然后根据返回的受影响行数判断是否更新成功,如果返回0行受影响说明已达到最大的领取数了。
1 请登录后投票
   发表时间:2016-04-06   最后修改:2016-04-06
这个锁的粒度太大了
是否可以按照红包枷锁,或者存到redis,进行原子更新判断呢
0 请登录后投票
   发表时间:2016-04-08  

使用高级锁或者自己实现根据业务数据加锁,既能保证并发又能防止相同业务对象脏读访问.

 

可以参考该贴:http://bbs.csdn.net/topics/391916533

 

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics