几年前做过一个项目,Mysql数据库、JAVA写的电子地图代理服务器,VC6写的电子地图客户端。大体流程是:电子地图装在客户端,客户端访问代理服务器请求热点数据,代理服务器向数据库查询数据,返回给客户端。在这个流程里,热点数据大约是500条左右,共计40K,不算多,所以每次都传输全部数据。
这个项目安装在5个不同的地区,去年底用户提出这5点联网的要求,要求在总部设立电子地图代理服务器,可以看到各分部所有的热点数据,设计能力要求达到10000个热点数据的容量。为此,要采用增量数据传输技术。
一、增量传输体现在三个层面:
1、数据库访问增量,即代理服务器公共热点数据队列与数据库的增量;
2、数据传输增量,即仅传输代理服务器各客户服务线程与公共热点数据之间的增量;
3、客户端热点数据做缓存队列,接收增量后修正缓存。
二、具体实现:
1、数据库增量的实现,通常有两种做法:
一是数据表中设置时间字段changedt,当数据表中的任何一个字段变化时,更新changedt,这个做法通常应用在数据表记录数增长不大,但是记录内容修改频繁的情况。增量访问的SQL语句大体是这样子:select 字段名1,字段名2 from tablename where changedt >='上次访问记录里最后的时间'。
二是根据数据表的myid(自增量字段),通常用在记录一旦添加就不再修改的情况下,比如日志。SQL语句大体上是这样子:select 字段名1,字段名2 from tablename where myid>上次访问的myid
代理服务器公共热点数据队列据此建立完毕。
2、数据传输增量的实现:
在代理服务器端,做一个公共访问队列,缓存所有的热点数据,注意这个队列的记录中要包含访问权限,比如局、处、科的设置。客户登录代理后,代理会专门为用户增设一个线程,此线程记录了此用户的访问权限,应答用户访问请求时,不再直接从数据库中取数据,而是访问代理服务器公共热点数据队列中符合自己访问权限的数据,由于这些动作都是访问缓存,所以并发处理能力很好。
3、客户端热点数据做缓存队列,接收到增量数据后,修正。
三、注意事项:
1、在数据库增量的实现代码中,要特别注意时间条件,请看一下上面“二、具体实现 1、”中的SQL语句,是“>=”而不是“>”,这是为什么呢?是并发的存在,因为在任何一个时间点,都可能会发生代理已取得数据的同时,又有新变化发生,而您下次再从大于这个时间点的条件下取数据,会有遗漏。
另外,要注意定时(比如10分钟)最好从数据表中取一次全数据(非增量),以策万全。
2、在数据传输增量的代码中,一要注意发送给客户端的代码中全数据与增量数据的标识,二要定时传送全数据,三是增量数据包括增加要减少的记录。
3、客户端接收到热点数据的全数据时,不要全部删除缓存队列,而是要用缓存与接收到的全数据做双向对比。通常情况下,客户端接收的数据是一段字符串,VC++可以用Find,JAVA可以用indexof,这里也要注意,必要时字符串前或后要考虑加间隔符。比如收到“a,1,3$|ba,1,3”,需要另设一个变量“$|a,1,3$|ba,1,3”,相应地匹配字串用“$|a,1,”以防止匹配“a,1”时误判。