The datastore is designed with web applications in mind, with an emphasis on read and query performance.
要知道,datastore是为Web应用程序而设计的,其重点关注的是读取和查询的性能。
All queries are pre-indexed for fast results over very large data sets.
为了在大量数据集中快速查询到结果,在datastore中所做的所有查询都必须事先建立索引。与在关系型数据库系统中建立索引的方式不同,在Google App Engine for Java应用中,整个应用程序所使用到的索引被保存在一个XML文件中。你可以手工编写,也可以由Google Plugin for Eclipse自动生成。
With the App Engine datastore, every attempt to create, update or delete an entity happens in a transaction
.
对App Engine datastore而言,每次创建、更新或删除一个实体的行为都在一个事务中完成。
All entities fetched, created, updated or deleted in a transaction must be in the same entity group.
在一个事务中,对多个实体进行增、删、改、查操作时,这些实体必须属于同一“实体组”。在这里,对“实体组”的概念不好理解,下面以一组代码段来解释:
public class Employee {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent
private String firstName;
@Persistent
private String lastName;
@Persistent
private Date hireDate;
...
}
public class ContactInfo {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
private String streetAddress;
@Persistent
private String city;
@Persistent
private String stateOrProvince;
@Persistent
private String zipCode;
...
}
Employee em = new Employee("Jiankang", "Jin", new Date());
ContactInfo info = new ContactInfo("ZhiChun Road", "Beijing",
"Beijing", "010");
PersistenceManager pm = PMF.get().getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
tx.begin();
pm.makePersistent(em);
pm.makePersistent(info);
tx.commit();
} catch (Exception e) {
System.out.println(e);
} finally {
if (tx.isActive()) {
tx.rollback();
}
pm.close();
}
运行Servlet,在控制台看到:
javax.jdo.JDOFatalUserException: Illegal argument
NestedThrowables:
java.lang.IllegalArgumentException: can't operate on multiple entity groups in a single transaction.
修改后:
public class Employee {
...
@Persistent
private ContactInfo contactInfo;
...
}
ContactInfo info = new ContactInfo("ZhiChun Road", "Beijing",
"Beijing", "010");
Employee em = new Employee("Jiankang", "Jin", new Date(), info);
PersistenceManager pm = PMF.get().getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
tx.begin();
pm.makePersistent(em);
pm.makePersistent(info);
tx.commit();
} catch (Exception e) {
System.out.println(e);
} finally {
if (tx.isActive()) {
tx.rollback();
}
pm.close();
}
再次运行Servlet,无异常。查看http://127.0.0.1:8080/_ah/admin,Kind Employee有一条记录,Kind ContactInfo有一条记录(注意:不是两条,代码pm.makePersistent(info)是不必要的,即使写了,也只保存一条ContactInfo记录)。而且,The key of the ContactInfo
entity has the key of the Employee
entity as its entity group parent. 这句话可能引起歧义,我原以为前者的key包含后者的key,但结果是:
the key of Employee is 'agByDgsSCEVtcGxveWVlGAEM',
and the key of ContactInfo is
'agByHwsSCEVtcGxveWVlGAEMCxILQ29udGFjdEluZm8YAgw'.
在Google Groups上请教了该问题,上述现象是正常的,两者的key确实不是简单的字符串包含关系。但可以肯定的是:
KeyFactory.stringToKey(employeeKeyString).equals(KeyFactory.stringToKey(con
tactInfoKeyString).getParent())
参见:http://groups.google.com/group/google-appengine-java/browse_thread/thread/76ca595de10a5a5a/95509d1364acc9d4?lnk=gst&q=jinjiankang1980#95509d1364acc9d4
Entity groups are defined by a hierarchy of relationships between entities.
如果多个实体间有关联关系,则它们组成一个实体组。据我我理解,这里的“a hierarchy of relationships”就是指UML中的组合或聚合。
(如何使用附件源代码注:使用Google Eclipse插件建立工程,工程名GAE_Test,包名com.gaetest)
(所使用的GAE JDK:appengine-java-sdk-1.2.2)
分享到:
相关推荐
**Google Datastore for Java 文档摘录(四)** 在这一部分,我们将深入探讨Google Datastore,这是一个在Java环境中使用的云数据库服务。Google Datastore是一个NoSQL文档数据库,提供了高可用性和可扩展性,适用...
在Android开发中,数据存储是不可或缺的一部分,DataStore是Google推出的一种新型持久化存储解决方案,旨在替代SharedPreferences。本文将深入探讨Android DataStore的使用方法及其封装技巧,旨在帮助开发者更好地...
在PowerBuilder(PB)开发中,DataStore是一个重要的对象,用于存储和操作数据库中的数据。在本示例中,我们详细探讨如何创建、查询、取值以及释放DataStore。 1. **创建DataStore**: 创建一个名为`ds_sale`的...
Google Datastore的JAR
VMware Infrastructure SDK for Java 是一个由VMware公司提供的软件开发工具包,专为Java开发者设计,用于构建与VMware虚拟化平台交互的应用程序。这个SDK包含了一系列的库、示例代码和文档,使得开发者能够利用Java...
标题中的“初用Google App Engine for Java”表明我们要探讨的是如何使用Google的App Engine平台来开发Java应用程序。Google App Engine是一个基于云计算的平台,它允许开发者构建和运行Web应用程序,无需管理和维护...
在IT行业中,Google App Engine(GAE)是一个广泛使用的平台,它允许开发者构建并托管Web应用程序。本示例主要关注如何将文件上传到Google App Engine的数据存储(Datastore)。数据存储是GAE的一个核心组件,它是一...
"Laravel Datastore"在此上下文中可能指的是Laravel与Google Cloud Datastore的集成,这是一个NoSQL数据库服务,用于存储非结构化数据。在这个主题中,我们将深入探讨Laravel框架与Datastore的结合使用,以及相关的...
【标题】"gaedo-google-datastore-0.6.2.zip" 提供的是一个与 Google Datastore 集成的开源库,版本为0.6.2。Google Datastore 是 Google 提供的一项托管式数据库服务,它适用于需要高度可扩展性和高可用性的应用。...
1. **DataStore**: DataStore是PowerBuilder中的一个对象,用于存储临时数据。它可以被看作是一个小型的内存数据库。 2. **虚拟DataStore**: 虚拟DataStore是指没有实际的物理表或视图对应的数据存储对象。它通常...
【标题】"google-api-services-datastore-v1beta1-rev28-1.15.0-rc.zip" 涉及的是Google的Datastore API服务的Java客户端库,这是一个针对Google Cloud Datastore的版本1beta1的API,具体版本为rev28,使用的Java...
Java SDK为开发者提供了一组API,可以用来访问Google App Engine的服务,如数据存储(Datastore)、任务队列(Task Queue)、邮件服务(Mail Service)、图像服务(Images Service)等。 在压缩包"appengine-java-...
**Google App Engine 1.3.0 Java SDK 第一部分** Google App Engine(GAE)是谷歌提供的一项云计算服务,允许开发者在谷歌的基础设施上运行自己的应用程序。它为开发者提供了无服务器(Serverless)的环境,可以...
10. **项目结构**:在`js-datastore-fs-master`压缩包中,包含了源代码、测试文件、文档等资源,开发者可以通过阅读源码和文档了解其工作原理,也可以直接在项目中引入使用。 通过理解和应用`datastore-fs`,前端...
在MATLAB中,`datastore`是一个非常重要的数据管理工具,尤其对于数据分析和处理工作流程。这个工具允许用户高效地组织和操作大量数据,而无需将所有数据加载到内存中,这极大地提升了处理大型数据集的能力。在...
Datastore提供了一种NoSQL文档数据库模型,支持复杂的查询,并且与Google Cloud Platform的其他服务集成良好。 **google-cloud-datastore库** 是Python开发者用来连接和操作Google Cloud Datastore的工具。该库...
The journey begins with a look at the Google Plugin for Eclipse and finishes with a working web application that uses Google Web Toolkit, Google Accounts, and Bigtable. Along the way, you’ll dig ...