1

取得したばかりのオブジェクトのリストの JDO 永続性に問題があります。

私がやりたいことは次のとおりです。

  • 「注文」のリストを取得する
  • 1 つのプロパティ「ステータス」を変更します
  • 「オーダー」の一括更新

私がこれまでに得たのは、「IDを持つオブジェクト...は別のオブジェクトマネージャーによって管理されています」です。しかし、待ってください。Spring がなければ、このような問題に直面したことはありません。

次のようにデバッグしようとしました:

List<Orderr> orders = orderDao.findByIdAll(ordersKeys);
for(Orderr o : orders) {
    System.out.println(JDOHelper.getPersistenceManager(o).hashCode());
    //hashcode is 1524670
    o.setSomething(somevalue);
}
orderDao.makePresistentAll(orders); //hashcode inside is 31778523

makePersistentAll は次のことしか行いません。

try {
    System.out.println(getPersistenceManager().hashCode());
    getPersistenceManager().makePersistentAll(entities);
} finally {
    getPersistenceManager().close();
}

私のDAOはすべて JdoDaoSupport を拡張しています。PMFはスプリングで注入管理。

最後に、質問があります。findByIdAll の後で永続化マネージャーが閉じられるのはなぜですか? または、なぜ新しい持続性マネージャーのインスタンスを取得するのですか? もちろん、私の findByIdAll メソッドは永続化マネージャーで close を呼び出しません。

もちろん、「注文」ごとに makePersistent を呼び出すと、うまく機能します。しかし、それはビジネスとデータベースロジックの階層化を壊します...

UPD 春に管理された PersistenceManager に移行した後、makePersistentAll へのすべての呼び出しがまったく機能しないことがわかりました。春の前に私は単純な古い PMF.get() ヘルパーを使用しましたが、すべてがピカピカでした!

4

2 に答える 2

1

HTTP リクエストに応答してアプリが 30 秒以上ライブのままである場合、そのアプリは強制終了されます。GAE の動作モードの一部は、アプリの寿命が長くないことです。まったく。

自分のサイトでこれを行うことはありませんが、DB セッション マネージャーに短期間しかアクセスできないことに慣れる必要があります。トランザクションごとに再オープンするのに多くの時間が必要な場合がありますが、GAE がプロセスをスケーラブルにするのはそのためです。本当に大量のトラフィックがある場合は、複数のサーバーでアプリケーションを並行して実行できます。

于 2010-01-02T20:53:22.563 に答える
0

これは一種の魔法です。ここで質問するたびに、投稿後 24 時間以内に質問への回答を知っています。

もちろん、ファクトリは常に新しい pm インスタンスを作成する必要があります。これで、古い pm への参照を保存し (春の jdo daos の前に行ったように)、すべて問題ありません。

于 2010-01-03T09:58:47.807 に答える