背景:目前有一个定时同步的应用,每天定时从一个系统中提取数据到同步到其他系统。现在的做法是,1、在业务表上新建了触发器,有业务新增时,往同步标识表里新增一条数据(ID、Flag=7)2、业务发生变化也往同步标识表插入一条数据(ID、Flag=8),3、同步程序完成数据同步后修改标识(ID、Flag=9)表示完成。问题主要有:1、同步标识表有2个字段(联合主键)当初的设计不合理,现在表里的数据很多了,不停的对这个表进行修改速度非常慢!2、经常有主键唯一性问题的报错。新手,求高手指导如何设计同步表?
个人建议:如果你程序写的严谨的话,再每张表增加一个lastupdatedate(最后修改日期)字段。获取你本地需要同步数据的每张表的最大lastupdatedate日期的数据。将服务器上所有大于lastupdatedate数据可以分批抓取,比如一次抓取100条。每次抓取100条后,原封不动将获取的数据插入本地。再次查询最后本地最后一条的lastupdatedate字段的值。再去抓取大于本地表数据的。直到所有数据获取完毕。建议可以适当的用假死循环如
bool isupdae=true;
int pageSize=100;
while(isupdae)
{
string sql="select max(lastupdatedate) as lastupdatedate from A";
DateTable dt=dbHelp.GetDataTable(sql);
DateTime lastupdatedate=dt.rows["lastupdatedate "]==DBNull.Value?datetime.now:convert.datetime(dt.rows["lastupdatedate "]);
//获取服务器数据,具体看你怎么返回服务器数据啦,lastupdatedate:本地某表最后一条修改记录的修改日期。pageSize:每次向服务器获取数据条数,主要解决大数据一次拉取卡死
object dataObj=webAPI.getData(lastupdatedate,pageSize);
if(dataObj==null)//数据同步完毕
{
isupdae=false;
}else{
//处理你获取到的数据,插入到本地
isupdae=true;
}
}
此方法即使你下次换个客户端,同步依然能获取到你所有数据啊,比你修改服务器标记强多了。
兄弟核心代码思路都给你啦,打赏点吧
1、你总不会拿ID来当同步表的主键吧?另外建一个主键(一个就够了,不用两个),
类型GUID,自动生成,你也不需要去维护。
2、Flag=9的数据有必要保留吗?
从你提供的信息只看出这些来,可能其他高手可以看出更多吧....
提供另外一种思路:我不关心同步的过程,我只在同步完成后,通过两个表之间的差异来生成标识写入到日志表。
能不能利用数据库自己的特性,比如mysql就支持主从同步功能。
另外,感觉Flag=9没必要,同步完把记录删除了就行了。
触发器。。。,一般业务表会有创建时间这种字段吧,每次扫这个字段同步就好了,何必还多存一次