我試圖更新ProfileEntity
我所有的4000點的對象,但我得到以下異常:更新在JPA實體中的所有對象
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();
}
我m猜測我花了很長時間查詢ProfileEntity
的所有記錄。 我該怎麼做?
- 我正在使用Google App Engine,因此無法更新查詢。
編輯18/10
在這2個日子裏,我嘗試:
使用後端爲薩諾斯Makris建議,但到了一個死衚衕。你可以看到我的問題here。
閱讀DataNucleus對Map-Reduce的建議,但真的迷路了。
我正在尋找不同的方向。因爲我只會做這個更新一次,也許我可以手動更新每200個物體左右。
是否有可能查詢前200個對象,然後是第200個對象等等?
您可以發佈完整的堆棧跟蹤? –
然後,我會建議使用任務隊列API來實現此目的。在那裏,通過使用遊標,您將能夠查詢一批實體,更新它們並將它們存儲回去。 –