2011年7月5日 星期二

心得 Google app engine deletePersistentAll

JDO 中,可以利用 deletePersistentAll 來刪除符合條件的資料


例如.

javax.jdo.Query query = pm.newQuery(Person.class);
query.setFilter("height > 100");
query.deletePersistentAll();




不過若因為符合資料太多 則會造成 java.lang.OutOfMemoryError: Java heap space 的錯誤(heap 空間不夠),

可以考慮其他方式, 因為 google app enigne 的查詢只允許 1 個範圍的過濾查詢[2], 目前想到的方式是用order 後 取出前幾位,之後在將每個屬性判斷否符合條件在刪除, 用起來還真不方便....







參考

1 則留言:

Cc 提到...

若考慮使用選取前1000 筆資料的方法,就要改寫, 因為 deletePersistentAll 和 setRange 會有衝突,(有 條件式如 > )至少今天我試是會這樣,改寫得code



PersistenceManager _thePm = PMF.get().getPersistenceManager();
javax.jdo.Query query = _thePm.newQuery(Person.class);
query.setFilter("height > 100");
query.setRange(0, 1000);
Object _InverterAll= query.execute();
_thePm.deletePersistentAll(_InverterAll);
_thePm.close();

不過前幾天可以,今天是又不行