2010-06-22 21 views
1

這是我的代碼片段。這段代碼對本地開發數據存儲非常有效。但在真正的應用程序引擎上不起作用。這裏使用的查詢過濾器只返回181行。如何使用已過濾查詢從應用引擎中刪除數據

import com.google.appengine.api.datastore.DatastoreService; 
import com.google.appengine.api.datastore.DatastoreServiceFactory; 
import com.google.appengine.api.datastore.Entity; 
import com.google.appengine.api.datastore.FetchOptions; 
import com.google.appengine.api.datastore.Key; 
import com.google.appengine.api.datastore.Query; 
import com.google.appengine.api.datastore.Query.FilterOperator; 
Query query = new Query("Share"); 
query.addFilter("timeOfData", FilterOperator.GREATER_THAN, sdf.parse(date)); 
query.setKeysOnly(); 
ArrayList<Key> allKeys = new ArrayList<Key>(); 
if(numberOfRowsToBedeletedAtOnceString != null) 
numberOfRowsToBedeletedAtOnce = Integer.parseInt(numberOfRowsToBedeletedAtOnceString); 
    for (final Entity e : dcc.prepare(query).asIterable(FetchOptions.Builder.withLimit(numberOfRowsToBedeletedAtOnce))) 
    { 
     allKeys.add(e.getKey()); 
    } 

    allKeys.trimToSize(); 
    dcc.delete(allKeys); 
    out.print("Deleted By Date count : " + allKeys.size()); 
    out.flush(); 
    out.close(); 

回答

1

如谷歌文檔建議您可以使用刪除實體通過查詢

Query query = pm.newQuery(Person.class); 
query.setFilter("height > maxHeightParam"); 
query.declareParameters("int maxHeightParam"); 
query.deletePersistentAll(maxHeight); 

檢查here

+1

它看起來像OP正在使用低級數據存儲區API,您的答案是使用JDO API。我認爲OP正在尋找使用低級API的答案。 – 2010-06-23 16:58:16

+0

如果沒有過濾器,低級別和JDO API都可以正常工作以便在chinks中刪除。但是當我添加這個過濾器時,它不再工作。 – iftee 2010-06-23 18:55:34

1

你是什麼意思是 「不工作」,專門?有沒有錯誤信息?它說什麼?另外,numberOfRowsToBedeletedAtOnce的價值是多少?

如果它是最後期限,或者您收到的錯誤說刪除太大,請嘗試減少numberOfRowsToBedeletedAtOnce

+0

我只是試圖刪除181行,這是我認爲很小。 – iftee 2011-01-30 04:18:37

+0

如果您試圖在限制爲30秒的應用引擎http請求中執行此操作,它並不算小。請記住,應用引擎數據存儲不像傳統的rdbms;特別是寫入速度要慢一個數量級。像這樣的操作,你可能通常在sql shell中執行的操作不一定在單個應用程序引擎http請求中起作用。 如果您真的想一次性刪除它們,而不是小批量,請嘗試在cron作業或任務隊列任務中進行。最近的截止日期從30多歲提高到了10歲。 – ryan 2011-01-30 04:48:11

相關問題