【发布时间】:2015-06-07 15:20:19
【问题描述】:
在我的应用程序的 Servlet 中,我想控制它的 Datastore 是否为空(我第一次运行 servlet 时它将为空,但现在不是这种情况,因为我已经填充了它并使其持久化)在继续其余代码之前。在这个Datastore Docs 中,我发现了一种查询数据存储并获取不同类型统计信息的方法。 但是在执行时:
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
Entity globalStat = datastore.prepare(new Query("__Stat_Total__")).asSingleEntity();
Long totalBytes = (Long) globalStat.getProperty("bytes");
Long totalEntities = (Long) globalStat.getProperty("count");
当我尝试存储两个 Long 变量时,我得到一个 NullPointerException。
为什么查询后Entity globalStat对象为空?
编辑 1:附加信息
我正在尝试在使用List<Entity> of Entities 填充数据存储区后获取统计信息:
public class MyServlet extends HttpServlet {
ArrayList<Tour> m_tours = new ArrayList<Tour>();
Key tourKey;
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
//.... some code
private DatastoreService populateDatastore(){
//... some other code ...
List<Entity> List = Arrays.asList(tour,tour1,tour2,tour3,
tour4,tour5,tour6,tour7,tour8);
datastore.put(List);
Entity globalStat = datastore.prepare(
new Query("__Stat_Total__")).asSingleEntity();
try{
Long totalEntities = (Long) globalStat.getProperty("count");
Long totalBytes = (Long) globalStat.getProperty("bytes");
}catch (NullPointerException e){
e.printStackTrace();
}`
}
}
仅此说明 Entity globalstat 对象在调试工具中仍显示为 null:
当我刚刚用几个实体填充数据存储时,new Query("__Stat_Total__")).asSingleEntity(); 怎么没有产生任何结果?
【问题讨论】:
-
最终一致性。你放然后在它后面查询。这是预期的。您的数据尚未完全传播到数据存储区
-
好的,但这不是只有在我第一次填充数据存储时才如此吗?因为我确信现在 Datastore 里面有几个实体(因为我可以查询它)。然后,即使数据存储区实际上是空的,数据存储区统计信息是否也应该可用?
-
你是对的,如果数据存储区已经有实体,最终的一致性应该不是问题。我认为这是一个带有“推送然后查询”的测试。老实说,我不知道是否可以直接获得统计数据。
-
难道没有第二种方法可以检查数据存储区之前是否已被填满?
-
数据存储管理查看器本身。如果您访问 console.developers.google.com 并导航到它。
标签: java android google-app-engine servlets google-cloud-datastore