2014-09-11 33 views
3

我的Java应用程序具有访问MongoDB集合的REST GET apis(用JAX-RS实现)。 我试图引入网页缓存以减少响应时间(通过减少在MongoDB端读取文档)。MongoDB文档中的ETag工具 - Java驱动程序

我在找标准的方式对资源提供ETag的http://en.wikipedia.org/wiki/HTTP_ETag)(资源从MongoDB中收集文件得到的),使的ETag MongoDB中收集将自动更新,每次更新文档。

现在,我可以使用ETag在MongoDB文档中的HTTP请求(“If-None-Match”)中验证ETag,如果两者相同,则返回304(未修改)。现在,WebCache可以将已经缓存的资源返回给客户端,从而缩短响应时间。

在谷歌上搜索,我得到了以下两个选择:

  1. hascode()作为ETag的:从MongoDB中获得文件和填充的Java 对象,然后,计算出的hashCode(),它被用作ETag的。但我 想避免这种开销(全DOC读+哈希码计算) https://devcenter.heroku.com/articles/jax-rs-http-caching

  2. 最后修改日期为ETag的:添加新字段“上次修改时间”对MongoDB的 集合。 http://howtodoinjava.com/2013/06/05/jax-rs-resteasy-cache-control-with-etag-example/ 此机制更适合“上次修改”标题(HTTP 响应)。看起来,日期在这里被误用于ETag。在这里我要 修改现有的文档插入新字段(updatedTime)。同样, HTML日期的精确度是sec,mongoDB日期是msec。

请建议标准方式在MongoDB中提供ETag。

回答

0

在将对象保存在MongoDB中之前,我正在做哈希码计算,将其存储在字段etag中。

当收到请求时,我可以查找{"_id": REQUESTED_ID, "etag": {$ne: RECEIVED_ETAG}}

如果没有文档返回,您可能仍然需要找出文档{"_id": REQUESTED_ID}是否存在(我这样做,但可能在您的情况下,WebCache可以处理这个并返回404,否则304)。

如果确实返回文档,只需使用它的etag属性填写ETag标题,并可能将其从返回的主体中删除。

相关问题