2015-10-26 2 views
3

Для целей тестирования я поставил следующий код в OnCreate() одного из видов деятельности:Q: Parse.com запрос счетчика стабильность

// Create 50 objects 
    for (int i = 0; i < 50; i++) { 
     ParseObject obj = new ParseObject("test_obj"); 
     obj.put("foo", "bar"); 
     try { 
      obj.save(); 
     } catch (ParseException pe) { 
      Log.d("Parsetest", "Failed to save " + pe.toString()); 
     } 
    } 

    // Count them 
    for (int i = 0; i < 10; i ++) { 
     ParseQuery<ParseObject> query = ParseQuery.getQuery("test_obj"); 
     query.countInBackground(new CountCallback() { 
      @Override 
      public void done(int count, ParseException e) { 
       if (e == null) { 
        Log.d("Parsetest", "Background found " + count + " objects"); 
       } else { 
        Log.d("Parsetest", "Query issue" + e.toString()); 
       } 
      } 
     }); 
    } 

Я бы ожидать, что граф будет всегда пятьдесят, однако работает этот код доходности что-то вроде:

D/Parsetest(17761): Background found 0 objects 
D/Parsetest(17761): Background found 0 objects 
D/Parsetest(17761): Background found 0 objects 
D/Parsetest(17761): Background found 0 objects 
D/Parsetest(17761): Background found 0 objects 
D/Parsetest(17761): Background found 0 objects 
D/Parsetest(17761): Background found 50 objects 
D/Parsetest(17761): Background found 0 objects 
D/Parsetest(17761): Background found 0 objects 
D/Parsetest(17761): Background found 0 objects 

Может кто-нибудь объяснить это поведение и как исправить это?

ответ

1

Не зная подробностей, я склонен полагать, что несогласованность вызвана потоками и смешением синхронных/асинхронных вызовов.

Например, вызов obj.save(); является синхронного (reference), однако, не видя остальную часть кода, вполне возможно, что синхронный сохранить в настоящее время выполняются в фоновом потоке.

Кроме того, query.countInBackground является асинхронным и вызывается несколько раз с циклом for. Это будет одновременно создавать 10 отдельных фоновых процессов для запроса Parse для подсчета объектов, и в зависимости от того, как справляется с сохранением, могут быть условия гонки.

И наконец, there are documented limitations по подсчету операций с парсером.

Кол-во запросов ограничено до 160 запросов за минут. Они также могут возвращать неточные результаты для классов с более чем 1000 объектов. Таким образом, предпочтительно, чтобы архитектор вашего приложения, чтобы избежать такого рода операции счетов (с помощью счетчиков, , например.)

От Эктор Рамос on the Parse Developers Google group,

Count запросы всегда были дорогими после того, как вы нажмете ограничения . Если вы всего лишь заботитесь об общем размере коллекции , вы можете запустить запрос на подсчет без каких-либо ограничений, а нужно довольно быстро, так как получение общего количества записей - чем считать, сколько из них соответствует произвольному списку ограничений. Это просто реальность работы с базами данных .

Учитывая стоимость операций подсчета, возможно, что у Парса есть механизмы для предотвращения быстрых всплесков операций подсчета от данного клиента.

Если вам нужно часто выполнять операции подсчета, рекомендуется использовать код облака после перехвата данных для увеличения/уменьшения счетчика по мере необходимости.

+0

Существует не так много кода, за исключением пластины котла Android. Выполнение счета в цикле просто иллюстрирует, что счет ведет себя неустойчиво/ненадежно. Такое же поведение существует при выполнении нескольких вызовов (так что даже с заполненной базой данных). И то же самое происходит при выполнении всего полностью синхронного. И рядом с этим я нигде не упоминал о размерах, которые могут вызвать какое-либо отношение. –

+0

Что произойдет, если вы выполняете только один запрос счетчика? Он работает каждый раз?Я не удивлюсь, если у Parse есть меры предосторожности, чтобы ограничить внезапный всплеск операций подсчета от одного и того же клиента, учитывая то, как дорогостоящие операции счета. Возможно, это так, так как 1 из 10 работает – Russell

+0

Вы также можете просмотреть эту ссылку, если вы еще не встретили ее. Я обновлю ответ с отрывком. https://groups.google.com/forum/#!topic/parse-developers/1GOv37oTY2k – Russell

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