2015-05-21 2 views
0

я получил простой ДЖЕРСИ WebService, который отвечает вернуть состояния, присутствующие в нашей базе данныхМожно ли использовать опцию управления кэшем в моем коде

package com.services.regg; 
@Path("/getstates") 
public class FetchStates { 
    @GET 
    @Consumes("application/text") 
    @Produces("application/json") 
    public String getAllSates() throws JSONException 
    { 
     JSONArray jsonarray_allstates = new JSONArray(); 
     Connection dbConnection = null; 
     PreparedStatement getAllStatesPst = null ; 
     ResultSet getAllStatesResltSet = null; 
     try 
     { 
      dbConnection = DBConnectionOrient.getDBConnection(); 
      getAllStatesPst = dbConnection.prepareStatement("select stateID , stateName from tbl_state ORDER BY stateName"); 
      getAllStatesResltSet = getAllStatesPst.executeQuery(); 
      while(getAllStatesResltSet.next()) 
      { 
       JSONObject eachrecordjsonObj = new JSONObject(); 
       String stateID = getAllStatesResltSet.getString("stateID").trim(); 
       String stateName = getAllStatesResltSet.getString("stateName").trim(); 
       eachrecordjsonObj.put("stateID", stateID).put("stateName", stateName); 
       if(!stateName.isEmpty() && !stateName.equals("")) 
       { 
       jsonarray_allstates.put(eachrecordjsonObj); 
       } 
      } 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      DBConnectionOrient.close(getAllStatesPst,getAllStatesResltSet); 
      DBConnectionOrient.close(dbConnection); 
     } 
     String response = "jsonCallback("+jsonarray_allstates.toString()+")"; 
     return response; 
    } 
} 

Все это прекрасно работает.

Как это работает для мобильных приложений, мы видим очень медленные ответы от бэкэнда

Я хочу, чтобы оптимизировать производительность приложения с моей стороны. Для этого я видел механизм управления кешем Джерси.

CacheControl cc = new CacheControl(); 
cc.setMaxAge(86400); 
cc.setPrivate(true); 

ResponseBuilder builder = Response.ok(myBook); 
builder.cacheControl(cc); 
return builder.build(); 

Мой вопрос, можно ли использовать CacheControl в моем коде, как я непосредственно отправка строки вместо ResponseBuilder.

Если да, не могли бы вы сообщить мне, как изменить мой код, чтобы использовать Cache Control?

ответ

0

Просто перестройте код, чтобы вернуть Response вместо String. Где используется Response.ok(myBook);, просто передайте его jsonp response вместо myBook.

Только другие способы включают непосредственное управление заголовками.

Если вы MUST придерживаться с использованием типа String возврата, то вы можете вводить HttpSerlvetResponse и просто установить заголовок

@GET 
public String getAllSates(@Context HttpServletResponse response) { 
    CacheControl cc = new CacheControl(); 
    cc.setMaxAge(86400); 
    cc.setPrivate(true); 
    response.addHeader("Cache-Control", cc.toString()); 
    [...] 
} 

Или вы можете добавить заголовок внутри ContainerResponseFilter, если вы этого не сделаете хочу добавить его в каждый метод. Не уверен, какую версию на Джерси вы используете, но с помощью Jersey 2.x вы можете определить, какой метод будет использовать фильтр, так что только выбранные ресурсы пройдут через этот фильтр. Не уверен насчет Jersey 1.x, если эта функция доступна. Здесь the documentation для 2.x.

Смежные вопросы