假设我使用@GET方法进行以下Web服务调用:
@GET
@Path(value = "/user/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response getUserCache(@PathParam("id") String id,@Context HttpHeaders headers) throws Exception {
HashMap map = new HashMap();
map.put("id",id);
sqlSession session = ConnectionFactory.getsqlSessionFactory().openSession();
Cre8Mapper mapper = session.getMapper(Cre8Mapper.class);
// slow it down 5 seconds
Thread.sleep(5000);
// get data from database
User user = mapper.getUser(map);
if (user == null) {
return Response.ok().status(Status.NOT_FOUND).build();
} else {
CacheControl cc = new CacheControl();
// save data for 60 seconds
cc.setMaxAge(60);
cc.setPrivate(true);
return Response.ok(gson.toJson(user)).cacheControl(cc).status(Status.OK).build();
}
}
要进行实验,我在从数据库中获取数据前5秒钟减慢当前线程.
当我使用Firefox Poster打电话给我的网络服务时,在60秒内,在第二次,第三次呼叫等等时,看起来要快一些,直到60秒.
但是,当我将URI粘贴到浏览器(Chrome)时,它似乎每次都放缓5秒.我真的很困惑,如何使用这种技术实现缓存.这是我的问题:
> POSTER实际上会看到标题最大时间,并决定何时
取数据?
>在客户端(web,android ….),
当访问我的Web服务时,我需要检查标题然后
手动执行缓存或浏览器已缓存数据
本身?
>有没有办法避免从数据库中获取数据
每次?我想我将不得不以内存存储我的数据,
但是它可能会耗尽内存吗?
>在本教程中
JAX-RS caching tutorial:
缓存实际上如何工作?第一行总是从数据库中获取数据:
Book myBook = getBookFromDB(id);
那么它是如何被考虑缓存的?除非代码不以上/下顺序执行.
@Path("/book/{id}")
@GET
public Response getBook(@PathParam("id") long id,@Context Request request) {
Book myBook = getBookFromDB(id);
CacheControl cc = new CacheControl();
cc.setMaxAge(86400);
EntityTag etag = new EntityTag(Integer.toString(myBook.hashCode()));
ResponseBuilder builder = request.evaluatePreconditions(etag);
// cached resource did change -> serve updated content
if (builder == null){
builder = Response.ok(myBook);
builder.tag(etag);
}
builder.cacheControl(cc);
return builder.build();
}