WebGIS中以version方式实现代码更新后前端自动读取更新代码的方法

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1. 前言

GIS代码进行更新后,由于用户前端已有缓存,导致更新的功能不能被及时同步。为避免前端请求读取缓存,常见方法是在每一个请求后面加上一个随机生成的变量参数,这样可以保证每个请求都不会跟历史请求重复。但是,这样处理是不合理的,我们虽然避免了读取缓存,但是却会导致系统效率降低。

所以,我们要解决的问题应该是:只有当代码更新后,客户前端第一次触发的所有请求都应该不走缓存,而之后,相同请求缓存继续有效。

2.解决思路

核心思想为,在GIS的每次请求后面带上一个version参数,每次更新后version参数的值均发生变化,于是该version对应的任何请求,第一次均会重新从服务端读取最新数据,但是之后的请求由于version不再变化,缓存继续有效。

所以这里我们实际需要解决的问题变为了,如何能够自动化生成更新version。

3.实现方法

此方案主要针对前端version,所以我们要解决如何能够让该version自动赋值到前端JS代码中,而不是每次我们自己手动给一个version值。由于每次前端更新后,均需要使用ant将代码进行再次编译,所以我们的实现方法为:

a.在进行ant编译时生成时间戳变量,再将该变量直接写入到待打包的JS代码中。

b.前端所有JS代码获取时加上version变量参数。

4.补充一点:如果是数据更新了怎么办?

首先,我们将数据分为两种,一种是我们自己GIS业务库中的配置数据,一种是地理服务器中的数据(包括第三方的地理服务器)。如果这两种数据均有更新,我们如何做到前端及时同步?

4.1GIS业务配置库中的配置数据读取

先抛出解决方案:同样,所有数据类请求加上时间戳,让数据类请求均不走前端缓存。

但是,不走前端缓存并不代表不走后端缓存,而这里则是我们已经或者还需进一步优化的地方:业务库中的GIS基本配置项都会在业务服务器启动时读取到内存中,所以如果配置数据做了更新,传统方案上需要业务服务器重启才行,但是目前业务已经提供了数据重载的接口。

所以,当业务数据做了更新后,要么重启业务服务,要么在构建中点击数据重载(会加入到GIS构建中)。这样可以保证,所有的GIS业务配置类数据请求会进入到后台,但是后台中缓存的数据是最新数据,从而既保证数据最新又避免对数据库的压力。

4.2地理服务器中的数据更新

方案1:同样使用随机时间戳来确保每次请求均是最新的数据,此种方法比较简单通用。

方案2:将version概念引入,数据库中增加一个数据version配置,每次地理服务器有更新后对version进行修改,然后使用构建让业务服务器重读配置,前端请求GIS配置时获得数据version,在请求地理服务时带上该version。

建议先以方案1来进行,这样与4.1中的数据请求可以同步,代码上可以统一处理。如果要进行方案2,则需要工程知道地理服务器何时做了更新,然后再在配置中修改version,稍微增加了工程维护量。

5.总结

5.1为什么前端JS和后台数据不用统一的version确保更新

a.如果用统一version,则该version需要使用库中配置(或配置文件),但是JS文件的加载往往是在数据请求之前,如此无法保证在version获得之前的JS文件为最新文件。

b.数据的更新并不代表系统需要重新编译,所以针对数据的version无法和JS版本的version同步。

5.2方案总结

a.前端JS使用ANT编译自动生成版本号。

b.数据请求加上随机时间戳。

 

                           -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                              如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                             

时间: 2024-09-27 12:50:21

WebGIS中以version方式实现代码更新后前端自动读取更新代码的方法的相关文章

Ubuntu系统更新后WiFi图标显示不正常解决方法

  Ubuntu系统更新后WiFi图标显示不正常解决方法.在Ubuntu系统中,很多用户都会在系统弹出更新提示后下载更新部分程序,但是最近有用户反映在更新完开机重启后发现WiFi图标成了一个扇形,无法搜索到信号,不能正常使用了.这是怎么回事?Ubuntu系统下更新后WiFi图标显示不正常该怎么解决呢? 解决过程: 在网上搜索了各种方法,总结的原因可能是驱动程序失效.更新软件后,驱动被禁用了. 常用的解决方法有: 1.用命令rfkill list all 查看那些被禁用了,然后用命令unblock

javascript实现倒计时N秒后网页自动跳转代码_javascript技巧

复制代码 代码如下: <title>JS倒计时网页自动跳转代码</title>   <script language="JavaScript" type="text/javascript">     function delayURL(url) {         var delay = document.getElementById("time").innerHTML;         if(delay &g

js控制5秒后页面自动跳转代码

js实现方法,我们使用setTimeout命令 <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> <script type="text/javascript">     function countDown(secs,surl){      

使用 Visual C# .NET 在 ADO.NET 中以编程方式构建连接字符串

ado|visual|编程|字符串 HOW TO:使用 Visual C# .NET 在 ADO.NET 中以编程方式构建连接字符串文章 ID : 310083 最后更新日期 : 2002年6月18日 版本 : 1.0 本文的发布号曾为 CHS310083有关本文的 Microsoft Visual Basic .NET 版本,请参见 309485. 本文引用下面的 Microsoft .NET 框架类库名称空间: • System.Data.OleDb 本任务的内容• 概要 • 要求 • 创建

(七)WebGIS中栅格、矢量图层设计之栅格、矢量图层的本质

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.何为栅格数据,何为矢量数据? 在GIS中,对于数据格式的分类,我们一般会将其分为栅格数据和矢量数据两种类型.栅格数据是将空间看做离散的像元,由二维数组或者其他数据组织方式来进行表达.矢量数据恰恰相反,它将空间看成是连续的,用要素(点.线.面)来进行表达. 我们把栅格数据和矢量数据的特点归纳如下: (1)栅格数据是离散的,矢量数据是连续的.所以栅格数据多用二维数组(

设置-eclipse中svn修改 代码更改后行头显示变化

问题描述 eclipse中svn修改 代码更改后行头显示变化 即代码修改后 行头会显示颜色变化,如下图所示,请问怎么设置

XMLHTTP无刷新自动实时更新数据

xml|数据|刷新|无刷新 传统上,我们浏览网页,如果加入最新的数据.只能是等我们重新向服务器端请求时才能显示出来.但是,对于一些时效性很强的网站,传统的这种做法是不能满足的. 我们可以让程序自动刷新,定时向服务器请求数据.5秒取一次数据,10秒取一次数据.利用XMLHTTP发出请求并取得数据.传到客户端,客户端重新组织并显示数据. demo.htm 前台显示. <script language="JavaScript">function GetResult(){/**--

使用Visual Studio宏来自动生成代码 [ Visual Studio | 宏 | 自动生成代码 ]

前言       宏的定义:是组合到一起形成一个命令以自动完成某项任务的一系列命令和指令.(MSDN)       在使用Visual Studio宏实现JS折叠功能的时候就想过用它来实现代码自动生成,有了前面的基础,实现起来就不那么困难了,本文将实现根据表名自动生成相关字段属性的Model代码.   正文       一.预备             1.1      关于宏的新建以及简单用法,请参见这里.             1.2      环境 Microsoft Visual St

FLASH中图片的方式代码

最近正好帮人家做一个图片的翻页的FLASH,所以重新研究了一下FLASH中图片的方式代码!以前自己写过一些,不过滚动的效果不是太好,基本的原理就是取起始值与最终值之间的差值,然后除以一个移动系数的方式来写! function mov() {   lx = n*w;   btx = btx+(lx-btx)/6;   this._x = Math.round(0-btx);  }以前写的一段代码!其中LX为最终值    BTX为其实值   6为一个系数   然后没经过一次移位后通过this._x