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 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 を使用して複数のオブジェクトに対して操作を実行するには、次の 2 つの方法があります。

  • バッチ処理 (複数オブジェクトの作成、更新、削除)
  • トランザクション (1 つ以上のビジネス ロジック/ルールを実行し、永続化)

バッチ処理は同じタイプのオブジェクトに制限され、トランザクションは同じグループのエンティティに制限されます。

いくつかのアドバイス:

  • 常に PM を閉じる
  • または、PM を閉じた後にオブジェクトを使用する場合 (つまり、JSP にオブジェクトのリストをレンダリングさせたいが、サーブレットが既に PM を閉じている場合) は、デタッチ メカニズムを使用できます。

これが助けになることを願っています。

于 2010-04-25T03:56:07.613 に答える
0

できるだけ多くの作業に同じ PersistenceManager を使用するようにしてください。

常に新しいものを取得すると、不必要なオーバーヘッドが発生する可能性があります。トランザクションを使用したい場合は、そこにあるすべてのアクティビティに同じマネージャーを使用する必要があると思います。

于 2010-04-25T02:35:41.093 に答える