1

我有一些这样的代码:

        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 才能处理每个对象?

4

3 回答 3

0

您应该尝试使用相同的 PersistenceManager 进行尽可能多的工作。

一直买一个新的可能会导致不必要的开销。如果你想使用事务,我相信你必须为那里的所有活动使用同一个经理。

于 2010-04-25T02:35:41.093 回答
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();
}
于 2010-04-25T03:37:50.173 回答
0
  • 每次您请求时,PersistentManagerFactory 都会给您一个新的 PersistenceManager。
  • 如果该应用程序不能处理太多请求,那就没问题。
  • 如果应用程序处理大量请求,您可能会得到:
    1. 某种异常(PMF 拒绝提供更多 PM)
    2. 由 Google 收取更多费用(效率低下)

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

  • 批处理(创建、更新、删除多个对象)
  • 事务(执行一个或多个业务逻辑/规则并持久化)

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

一些建议:

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

我希望这会有所帮助。

于 2010-04-25T03:56:07.613 回答