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 каждый раз, когда вы запрашиваете его.
- Если приложение не обрабатывает слишком много запросов, все в порядке.
- Если приложение обрабатывает много запросов, вы можете получить:
- Что-то вроде исключения (PMF отказывается давать больше PM)
- Оплачивается больше 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();
}