2

我的应用程序广泛使用分层数据选择(分类选择),例如(但不完全是):

Country
  => State
    => City
      => Street

所以用户选择第一级选项,JS AJAX加载第二级,用户选择AJAX加载第三级后,依此类推......

我认为加速应用程序的一种方法是将整个层次结构加载为 JS 文件并直接使用来自 JavaScript 的数据,利用If-Modified-Since /* Last-Modified * 和304响应代码来缓存这个大文件(50 KiB,12 之后gzip)和耗时(从数据库获取 300 毫秒)数据。

我不喷气式飞机实施害怕发明轮子的技术。如果我尝试实现,我会使用以下技术......

Spring 现在支持Last-Modified HTTP 1.1 标头:

@RequestMapping
public String myHandleMethod(WebRequest webRequest, Model model) {
    long lastModified = // 1. application-specific calculation
    if (request.checkNotModified(lastModified)) {
        // 2. shortcut exit - no further processing necessary
        return null;
     }
    // 3. or otherwise further request processing, actually preparing content
    model.addAttribute(...);
    return "myViewName";
}

Oracle 允许通过ALL_TAB_MODIFICATIONS/USER_TAB_MODIFICATIONS快速检查表更改:

select timestamps from all_tab_modifications where table_name = 'COUNTRY';
select timestamps from all_tab_modifications where table_name = 'STATE';
...

在使用分层数据的 JSP 页面上,我包含 js 文件:

 <script src="<c:url value='js/db/units.js'/>"></script>

具有完整的层次结构数据形式(像Java DWR一样):

uniqPrefix.units = {
  "USA": {
      "Alabama": { 
          "Montgomery": ["Street 1", "Street 2"],
          "Birmingham": ["Street 3", "Street 4"],
      }, ...
   "UK": { ... }
}

所以 HTML<select>标记由 JavaScript 代码填充,js/db/units.js无需任何 Ajax 查询......

js/db/units.js在服务器端,如果Country, State, City,Street表未从用户上次访问我们的网站时修改,我们不会重新生成...

通过利用浏览器If-Modified-Since请求参数和304 HTTP 服务器响应从应用程序服务器缓存数据是否正常,或者这根本是一种破坏方法?

4

2 回答 2

4

与任何其他 HTTP 客户端相比,Javascript 驱动的 HTTP 客户端没有什么特别之处,而您所描述的正是 304 响应的设计目的。如果数据未更改,您的应用程序避免重新加载数据。

于 2013-04-03T10:29:15.980 回答
1

使用缓存来避免从服务器重新检索 JS 是很正常的 - 在您的情况下这是否是一个好主意取决于页面的使用方式。如果您希望典型用户从层次结构中进行多项选择(否则需要多次 AJAX 调用),那么缓存听起来是个好主意。

从性能的角度来看,进行一次大调用通常也比进行大量小调用要好得多,对服务器的每次单独调用都有与之相关的开销 - 通过缓存所有 JS,如您所描述的,您只需支付一次此惩罚。

于 2013-04-03T10:28:36.490 回答