Google App Engine PersistenceManager может обрабатывать несколько объектов? - PullRequest
1 голос
/ 25 апреля 2010

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

        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 ]

0 голосов
/ 25 апреля 2010

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

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();
}
0 голосов
/ 25 апреля 2010
  • PersistentManagerFactory будет выдавать вам новый PersistenceManager каждый раз, когда вы запрашиваете его.
  • Если приложение не обрабатывает слишком много запросов, все в порядке.
  • Если приложение обрабатывает много запросов, вы можете получить:
    1. Некое исключение (PMF отказывается давать больше PM)
    2. Оплачено Google (неэффективно)

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

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

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

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

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

Надеюсь, это поможет.

0 голосов
/ 25 апреля 2010

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

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

...