数据库不断有新数据插入, 导致分页查询数据重复的问题

问题描述

首先, 查询数据时是按照数据的录入时间分页查询的, 最新的数据一直是第1页; 同时, 库表不断地有新数据写入, 这就导致了分页查询数据请求出现重复问题.

例如19:31分时分页查询请求第1页数据, 返回了5条数据

在这期间, 又有5条新数据插入到了数据库;

此时, 分页查询请求第2页数据, 由于新数据的插入, 之前第1页的数据已经变成了第2页的数据了, 所以第2页返回的数据和第1页一样, 造成了数据的重复.

解决思路

解决思路1

一次性返回符合条件的所有数据, 然后交给前端去分页, 此时前端拿到比如500条数据, 然后前端的分页就是数据展示的问题了, 而不再涉及到再次请求服务器, 因而就不会出现数据重复问题

但是, 分页的目的是为了减轻服务器请求的压力, 如果一次请求的数据量过大, 就会降低服务器的反应速度, 因此这个想法不太可行.

 

解决思路2

请求第1页时记录第1条数据(即最新的那条)的写入时间, 然后后面查询第2,3,4...页数据, 把记录的写入时间作为参数, 然后在sql语句中做限制

例如查询第2页, 设置写入时间小于等于2019-05-15 19:31:59, 这样即使有新数据插入, 也不在我们本次分页查询的范围内.

select * from table1 where write_time <=1557919919000 order by write_time desc limit 5,5

 

代码步骤

1. 首先, 在PageBean中添加属性time用于记录时间

2. 然后, 在dao中的sql中添加time查询条件

3.然后, 在service中对pageBean的time赋值, 这个值是从web层传过来的

		
		if(pageBean.getStart() == 0){
			// 查询的第1页, 时间置空, 获取限定时间
			pageBean.setTime(null);
		}else{
            // 不是第1页, 直接使用传来的限定时间
			pageBean.setTime(writeTime);
		}
		List<FaceCapture> faceCaptureList = faceCaptureDao.findByTimeDesc(startTime, endTime, deviceId, pageBean.getTime(),
				pageBean.getStart(), pageBean.getPageCount());
		
		// 第1页, 记录限定时间
		if(pageBean.getStart() == 0 && faceCaptureList != null && faceCaptureList.size() > 0){
			pageBean.setTime(faceCaptureList.get(0).getCaptureTime());
		}
		
		pageBean.setList(faceCaptureList);
		return pageBean;

service中, 首先判断PageBean.getStart()判断当前查询的是否为第1页, 如果是第1页, 就先置空PageBean的time;

然后查询数据, 因为查的是第1页, 所以第一条数据的时间就是最新的时间;

查完之后, 把这个时间赋给PageBean的time;

之后查询第2,3,4...也都要传这个参数作为sql限定

4. web层, 获取请求传来的time参数, 传给service

这样, 虽然每次请求第1页的数据都是获取最新的, 但是一旦请求完第1页, 获取最新数据的时间之后, 后面请求第2,3,4...页都会以这个时间最为限定, 从而保证新插入的数据不会影响本地查询, 也就防止了分页查询数据重复的问题.

运行效果

请求第1页数据, 传两个参数currentPage=1&pageCount=10, 然后PageBean返回time

请求第2页数据, 携带这个参数currentPage=2&pageCount=10&captureTime=1558600690102

 

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值