首页 新闻 会员 周边

多数据源/分布式查询分页问题求助

0
悬赏园豆:100 [已解决问题] 解决于 2014-09-20 23:47

假设:

X系统提供WebAPI接口:search(...),将X系统分别部署在A、B两地,

Y系统需要同时从A、B两地的X系统中查询数据并分页显示

 

请问X系统中的search(...)接口怎样设计才能满足分页查询的要求,谢谢了

wangd的主页 wangd | 初学一级 | 园豆:75
提问于:2014-09-09 17:57
< >
分享
最佳答案
0

这个问题有点复杂,有个不是太成熟的解决方案,供你参考:

取第一页的数据很简单,从A、B两个服务中分别获取pageSize条数据,这样可以得到两个数据集,dataA和dataB,然后可以在内存中将dataA和dataB合并成一个数据集,并重新排序,截取前pageSize数据,该数据集可以直接返回给UI了,同时要记录分别从dataA和dataB中获取的数据条数,记为indexA和indexB,保存到内存中。

获取第二条数据时,从A、B两个服务中分别获取自indexA和indexB开始的pageSize条数据,同样,在内存中合并,并记录新的indexA和indexB,供取下一页数据时使用。

这样,在你的A、B两个服务中的接口可以如下定义:
search(int startIndex, int pageSize[, conditions])

上述解决方案的问题在于,取第N页的数据时,需要第N-1页的数据状态,如果用户都是顺序操作,当然没有问题,如果用户希望直接调整到第N页,数据量比较大的时候这个性能就很差了,当然了,可以考虑将这些查询状态数据存储在主服务的缓存中,但这个牵涉到的数据同步更新就会比较复杂了。

我暂时只能想到这些,供你参考。

收获园豆:100
Paul Xu | 菜鸟二级 |园豆:302 | 2014-09-13 22:15

非常感谢,正是我想要找的答案

目前只提供上一页和下一页,使用你的方法正合适:

下一页时,从两个数据源中分别取pageSize条记录,重新排序后取前pageSize条

上一页时,重新排序后取后pageSize条

接口和你的相同,只是在取上一页时pageSize是负数,或者再添加一个参数表示上一页或下一页

wangd | 园豆:75 (初学一级) | 2014-09-20 23:46
其他回答(6)
0

1、使用数据库的同名特性,把A(或B)的表映射到B(或A),然后创建一个视图,再走数据库系统的分页功能。

2、直接在一个数据库里连接另外一个数据库,把俩表数据构建一个视图,然后再走数据库系统的分页功能。

519740105 | 园豆:5810 (大侠五级) | 2014-09-09 18:28

谢谢回答,不过Y系统需要通过X系统提供的API接口search获取数据,不能直接访问到X系统的数据库

支持(0) 反对(0) wangd | 园豆:75 (初学一级) | 2014-09-09 22:49

@BXTX: 那你这个问题是无解的,没办法简单、高效的执行这个操作。

不过,你还是可以:

1、两边分别读取数据,然后综合起来再分页

2、最好:数据分开分页,别走结合分页

 

建议:如果一定要结合分页,实现数据库系统的内部关联。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-09-10 08:41
0

m貌似有点难度的样子。

Firen | 园豆:5385 (大侠五级) | 2014-09-09 18:59

谢谢回答,是有点难度,数据量小时是可以将所有数据取出来在内存中分页,数据量多时就不知怎么搞了,希望能有个好办法

支持(0) 反对(0) wangd | 园豆:75 (初学一级) | 2014-09-09 22:53
0

你的内存需要大一点

迅捷网络[来送福利] | 园豆:576 (小虾三级) | 2014-09-10 08:33
0

不说别的,你需要的是1个同步后的索引,这个索引里有所有数据.剩下的就是这个索引怎么实现的问题了

吴瑞祥 | 园豆:29449 (高人七级) | 2014-09-10 08:51
0

你后台实时跑一个程序,进行这个两个库的数据查询操作,然后存到redis等里面

GisClub | 园豆:330 (菜鸟二级) | 2014-09-10 09:33
0

貌似不能直接实现,不过你可以借助第三方来实现,例如redis等.

晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 14:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册