2010-06-22 65 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

相关问题