Google App Engine PersistenceManager может обрабатывать несколько объектов?

У меня есть такой код:

        PersistenceManager pm=PMF.get().getPersistenceManager();
        String query="select from "+PayPal_Message.class.getName()+" where processed == false order by time desc";
        List<PayPal_Message> messages=(List<PayPal_Message>)pm.newQuery(query).execute();
        if (messages.isEmpty())
        {
        }
        else
        {
          for (PayPal_Message g : messages)
          {
            Contact_Info_Entry A_Contact_Entry=Process_PayPal_Message_To_Get_A_License(g.getContent().getValue());
            pm=PMF.get().getPersistenceManager();
            try
            {
              pm.makePersistent(A_Contact_Entry);
              g.setProcessed(true);
              pm.makePersistent(g);
            }
            catch (Exception e)
            {
              Send_Email(Email_From,"nm67@yahoo.com","Servlet Error Message [ "+time+" ]",new Text(e.toString()));
            }
//            finally { pm.close(); }

          }
        }
        pm.close();

Интересно, можно ли использовать PM выше для обработки нескольких объектов перед его закрытием. Или я должен получить и закрыть pm для обработки каждого объекта?

3 ответа

Решение
  • PersistentManagerFactory будет давать вам новый PersistenceManager каждый раз, когда вы запрашиваете его.
  • Если приложение не обрабатывает слишком много запросов, все в порядке.
  • Если приложение обрабатывает много запросов, вы можете получить:
    1. Что-то вроде исключения (PMF отказывается давать больше PM)
    2. Оплачивается больше Google (неэффективно)

Существует два способа использования PM для выполнения операций над несколькими объектами:

  • Пакетная обработка (создание, обновление, удаление нескольких объектов)
  • Транзакция (выполнение одной или нескольких бизнес-логик / правил и сохранение)

Пакетная обработка ограничена объектами одного типа, в то время как транзакция ограничена объектами одной и той же группы.

Некоторые советы:

  • Всегда закрывайте свой PM
  • В качестве альтернативы вы можете использовать механизм отсоединения, если хотите использовать объекты после закрытия PM (т.е. вы хотите, чтобы JSP отображал список объектов, но ваш сервлет уже закрыл PM)

Я надеюсь, что это поможет.

Вы должны попытаться использовать тот же PersistenceManager для максимально возможной работы.

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

Попробуй это...

PersistenceManager pm = null;
try
{
            pm=PMF.get().getPersistenceManager();
            String query="select from "+PayPal_Message.class.getName()+" where processed == false order by time desc";
            List<PayPal_Message> messages=(List<PayPal_Message>)pm.newQuery(query).execute();
            if (!messages.isEmpty())
            {
              for (PayPal_Message g : messages)
              {
                Contact_Info_Entry A_Contact_Entry=Process_PayPal_Message_To_Get_A_License(g.getContent().getValue());
                try
                {
                  pm.makePersistent(A_Contact_Entry);
                  g.setProcessed(true);
                  pm.makePersistent(g);
                }
                catch (Exception e)
                {
                  Send_Email(Email_From,"nm67@yahoo.com","Servlet Error Message [ "+time+" ]",new Text(e.toString()));
                }
              }
            }
}
finally
{
 if(pm != null) pm.close();
}
Другие вопросы по тегам