暂时调查一个问题。所以问社区。我的目标是获取所有特定类型的实体,它们都需要是最新的。(暂时不考虑任何事务隔离 - 可能是脏读)
我为此使用 GAE/J-JDO(使用 tx.begin() 只是一种预防措施):
PersistenceManager pm = PMF.get().getPersistenceManager();
Transaction tx = pm.currentTransaction();
Query q = pm.newQuery(TokenJdo.class);
List<TokenJdo> tokenList = (List<TokenJdo>) q.execute();
Collection<TokenJdo> res = Collections.unmodifiableCollection(tokenList);
tx.commit();
pm.close();
for (TokenJdo t : tokenList) {
log.info(t.getToken() + " - " + t.getCounter());
}
这样做会给我过时的实体(我请求一个列表,转到 AppEngine 控制台并修改一个实体,再次请求一个列表)。所以我直接使用 DatastoreService 编写了以下调试代码。
DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
com.google.appengine.api.datastore.Query gaeQuery = new com.google.appengine.api.datastore.Query(TokenJdo.class.getSimpleName());
PreparedQuery pq = ds.prepare(gaeQuery);
List<Entity> list = pq.asList(FetchOptions.Builder.withDefaults());
for (Entity i : list) {
log.info(i.getKey() + " - " + i.getProperties());
}
在一个请求中执行两段代码会给出以下输出,并显示通过 JDO 的数据与 DatastoreService 返回的数据相比已经过时:
I 2013-03-20 12:31:16.950 com.serverside.bl.TokenProviderJdo getAll: dummy - -999
I 2013-03-20 12:31:16.950 com.serverside.bl.TokenProviderJdo getAll: asd - 0
I 2013-03-20 12:31:16.951 com.serverside.bl.TokenProviderJdo getAll: dummy-aaa - -111
I 2013-03-20 12:31:16.957 com.serverside.bl.TokenProviderJdo logDSEntities: TokenJdo(7003) - {token=dummy, counter=-999}
I 2013-03-20 12:31:16.957 com.serverside.bl.TokenProviderJdo logDSEntities: TokenJdo(12001) - {token=asd, counter=0}
I 2013-03-20 12:31:16.957 com.serverside.bl.TokenProviderJdo logDSEntities: TokenJdo(13001) - {token=dummy-aaa, counter=-222}
显然(或者在我看来)JDO 使用某种内部缓存(L1 或 L2,尽管我没有明确启用任何缓存)。如何让 JDO 进行“干净”读取?