我正在編寫一個系統使用谷歌應用程序引擎,我需要把一個對象,只有當它不存在數據存儲。我會很好地使用datastore.put()
方法,除了我需要知道該對象是否已經存在以計算我擁有的新對象的數量。谷歌應用程序引擎性能 - 檢查對象的存在
據我知道,我有以下幾種選擇(假設我有鑰匙都爲屬性和實體鍵):
private Entity getEntity(String key)
{
DatastoreService datastore =
DatastoreServiceFactory.getDatastoreService();
// Build a query to select this entity from the database:
Query q = new Query("MyEntity");
q.setKeysOnly();
// Add a filter for the key attribute:
q.addFilter("key", Query.FilterOperator.EQUAL, key);
PreparedQuery pq = datastore.prepare(q);
// Select a single entity from the database
// (there should be no more than one matching row anyway):
List<Entity> list = pq.asList(FetchOptions.Builder.withLimit(1));
if (!list.isEmpty())
// Return the found entity:
return list.get(0);
else
return null;
}
或
private Entity getEntity(String key)
{
DatastoreService datastore =
DatastoreServiceFactory.getDatastoreService();
// Get a key that matches this entity:
Key key = KeyFactory.createKey("MyEntity", key);
try {
return datastore.get(key);
} catch (EntityNotFoundException e) {
// Entity does not exist in DB:
return null;
}
}
我傾向於使用第二個,因爲它看起來更直截了當,但我擔心它可能並不意味着以這種方式使用,因爲它引發了一個例外,並且可能會產生開銷。
哪種方法更適合檢查數據庫中是否存在實體?
有沒有更好的方法來做到這一點?
感謝。您能否提供一些有關通用最佳實踐的參考,性能方面?我找不到很多有關不同方式執行相同操作的性能影響的信息(asList vs asterable,get vs query,批量放置vs多個放置等)。 –
@Yanir簡而言之,更少的RPC總是更好。嘗試使用Appstats並對您懷疑的任何事情進行基準測試。 –