2017-01-27 9 views
0

Я создал простой jersey rest api для запроса cassandra. Также используется опрос Ajax Long. Но с каждой памятью запросов, использованием портов и потоками увеличивается даже после завершения запроса, это не уменьшается. закрыл сеанс кассандры, но не повезло. Ниже приведен код отдыхаCassandra, Jersey rest api увеличивает потоки, использование памяти и порты с каждым запросом на отдых

@Path("/pull") 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
public JSONArray get(@QueryParam("offset") String offset, @QueryParam("currentUser") String currentUser, 
     @QueryParam("longPolling") boolean longPolling) { 
    JSONArray messages = new JSONArray(); 
    JSONObject message = null; 
    Session session = Connector.getSession(); 
    String query = "SELECT * FROM messages"; 
    ResultSet resultSet = null; 
    PreparedStatement ps = null; 
    BoundStatement stmt = null; 
    int timeOut = 0; 
    try { 
     while (messages.length() == 0 && timeOut++ < 30) { 
      if (longPolling && !offset.equals("0")) { 
       query = "SELECT * FROM messages WHERE id > ? ALLOW FILTERING"; 
       ps = session.prepare(query); 
       stmt = ps.bind(UUID.fromString(offset)); 
       resultSet = session.execute(stmt); 
      } else { 
       resultSet = session.execute(query); 
      } 
      List<Row> ls = resultSet.all(); 
      ls.sort(new Sort<Row>()); 
      for (Row row : ls) { 
       if ((!longPolling || !row.getString("sentby").equals(currentUser))) { 
        message = new JSONObject(); 
        message.put("id", row.getUUID("id")); 
        message.put("sentby", row.getString("sentby")); 
        message.put("message", row.getString("message")); 
        messages.put(message); 
       } 
      } 
      if (messages.length() == 0 && longPolling) { 
       Thread.sleep(1000); 
      } 
     } 
    } catch (JSONException | InterruptedException e) { 
     e.printStackTrace(); 
    } finally { 
     message = null; 
     resultSet = null; 
     session.close(); 
    } 
    return messages; 
} 

ответ

2

Я думаю, что основная проблема заключается в том, что вы инициализируете сеанс и каждый раз отрывая его. Сессия является относительно тяжелым объектом, и только одно должно использоваться для каждого приложения. Поместите сеанс в какой-нибудь другой компонент, а затем используйте инъекцию зависимостей в своем коде здесь, чтобы получить его. Не открывайте и не закрывайте сеанс за запрос. Это определенно не будет исполнять.

Также не составляйте заявления каждый раз. На этом компоненте создайте только один подготовленный оператор и используйте его в запросах.

+0

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