Google App Engine PersistenceManager可以处理多个对象吗?

时间:2010-04-25 01:53:01

标签: google-app-engine persistence-manager

我有一些像这样的代码:

        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 :(得分:0)

您应该尽可能多地使用相同的PersistenceManager。

始终获得新的可能会导致不必要的开销。如果你想使用交易,我相信你必须在那里使用同一个经理进行所有活动。

答案 1 :(得分:0)

试试这个......

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();
}

答案 2 :(得分:0)

  • 每次请求时,PersistentManagerFactory都会为您提供一个新的PersistenceManager。
  • 如果应用程序没有处理太多请求,那么你没事。
  • 如果该应用处理大量请求,您可能会获得:
    1. 某种例外(PMF拒绝提供更多PM)
    2. Google收取更多费用(效率低下)

有两种方法可以使用PM对多个对象执行操作:

  • 批处理(创建,更新,删除多个对象)
  • 交易(执行一个或多个业务逻辑/规则并保留)

批处理仅限于具有相同类型的对象,而事务仅限于同一组的实体。

有人建议:

  • 始终关闭您的PM
  • 或者,如果要在关闭PM后使用对象,则可以使用分离机制(即,您希望JSP呈现对象列表,但您的servlet已经关闭了PM)

我希望这有帮助。