1

4000 個のオブジェクトをすべて更新しようとしてProfileEntityいますが、次の例外が発生します。

javax.persistence.QueryTimeoutException: The datastore operation timed out, or the data was temporarily unavailable.

これは私のコードです:

public synchronized static void  setX4all() 
{

    em = EMF.get().createEntityManager();

    Query query = em.createQuery("SELECT p FROM ProfileEntity p");
    List<ProfileEntity> usersList = query.getResultList();

    int a,b,x;
    for (ProfileEntity profileEntity : usersList) 
    {
        a = profileEntity.getA();
        b = profileEntity.getB();
        x = func(a,b);
        profileEntity.setX(x);

        em.getTransaction().begin();        
        em.persist(profileEntity);        
        em.getTransaction().commit();

    }

    em.close();

}

からすべてのレコードを照会するには時間がかかりすぎると思いますProfileEntity。どうすればいいですか?

  • 私は Google App Engine を使用しているため、UPDATE クエリは実行できません。

編集 18/10
この 2 日間で私は試しました:
Thanos Makris が提案したようにバックエンドを使用しましたが、行き止まりになりました。ここで私の質問を見ることができます。
Map-Reduce で DataNucleus の提案を読んでいますが、本当に迷子になりました。

私は別の方向を探しています。この更新は 1 回だけなので、200 オブジェクトごとに手動で更新できるかもしれません。
最初の 200 個のオブジェクトを照会し、その後 2 番目の 200 個のオブジェクトなどを照会することは可能ですか?

4

6 に答える 6

3

あなたのシナリオを考えると、ネイティブ更新クエリを実行することをお勧めします。

 Query query = em.createNativeQuery("update ProfileEntity pe set pe.X = 'x'");
 query.executeUpdate();

注意: ここでクエリ文字列はSQLieですupdate **table_name** set ....

これはうまくいくでしょう。

于 2012-10-15T13:09:42.943 に答える
1

Map-Reduceなどを使用するように更新プロセスを変更します。これは、すべてがデータストアで行われることを意味します。唯一の問題は、appengine-mapreduce がまだ完全にリリースされていないことです (ただし、jar を自分で簡単に作成して、GAE アプリで使用することはできますが、他の多くの人がそうしています)。

于 2012-10-15T15:10:50.413 に答える
0

あなたのクラスはあまりうまく動作しません.JPAはこの方法での一括更新には適していません.大量のトランザクションを迅速に開始し、データベースに多くの負荷をかけてしまいます. ユースケースのより良い解決策は、最初にJVMにロードせずにすべてのオブジェクトを設定するスカラークエリです(オブジェクトの構造と遅延に応じて、より多くのデータをロードします)

hibernate リファレンスを参照してください: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html#batch-direct

于 2012-10-15T13:07:03.107 に答える
0

すべてのオブジェクトに対して set(x) を使用する場合は、すべてのオブジェクトをフェッチして 1 つずつ更新するのではなく、JPA エンティティ マネージャーを使用してユーザー更新ステートメント (つまり、ネイティブ SQL) を使用することをお勧めします。

于 2012-10-15T13:04:30.700 に答える
0

10分までのタスクを実行できるTask Queue APIの使用を検討する必要があるかもしれません。タスク キューでは収まらないほど多くのエンティティを更新したい場合は、バックエンドのユーザーを検討することもできます

于 2012-10-16T11:50:38.867 に答える