事务和奥体组 在 App Engine数据存储区中,所有创建、更新或删除实体的尝试都可以在一个事务中 进行。事务可确保对实体所做的所有更改都保存到数据存储区中,或者,在失败的情况 下不做任何更改。这样便可确保实体中数据的一致性。 您可以使用事务API在单一事务中对一个实体执行多个操作。例如,假设您要使对象中 的计数器域递增。为此,您需要读取计数器的值,计算新的值,然后存储值。如果没有 事务,那么在您读取值和更新值之间,可能有另一进程使计数器递增,这会导致应用程 序覆盖已更新的值。在单一事务中进行读取、计算和写入操作可确保没有其他进程干扰 递增。 您可以在单一事务中对多个实体进行更改。为了支持这种做法, App Engine需要预先了 解哪些实体将“起更新,从而使用支持事务的方式来存储这些实体。您在创建实体时, 必须声明这一实体与另一实体同属一个实体组。在一个事务中抓取、创建、更新或删除 的所有实体都必须位于同一实体组中。 实体组是由实体之间关系的层次结构定义的。要在组中创建实体,您应声明该实体是组 中现有的另一实体的子实体。另一实体为父实体。不通过父实体创建的实体是根实体 如果一个根实体没有任何子实体,则其所在的实体组中只有这一个实体。每个实体都有 条从根实体到其自身的父实体-子实体关系路径(最短的路径没有父实体)。该路径 是实体完整键中必不可少的一部分。完整的键可以用路径中各实体的类型以及ID或键 名来表示。 数据存储区使用开放式并发来管理事务。在一个应用程序实例将更改应用到实体组中的 实体时,对于该组中任何实体的所有其他更新尝试都会立即失败。应用程序可再次尝试 事务,将其应用到更新的数据
事务和实体组 在 App Engine 数据存储区中,所有创建、更新或删除实体的尝试都可以在一个事务中 进行。事务可确保对实体所做的所有更改都保存到数据存储区中,或者,在失败的情况 下不做任何更改。这样便可确保实体中数据的一致性。 您可以使用事务 API 在单一事务中对一个实体执行多个操作。例如,假设您要使对象中 的计数器域递增。为此,您需要读取计数器的值,计算新的值,然后存储值。如果没有 事务,那么在您读取值和更新值之间,可能有另一进程使计数器递增,这会导致应用程 序覆盖已更新的值。在单一事务中进行读取、计算和写入操作可确保没有其他进程干扰 递增。 您可以在单一事务中对多个实体进行更改。为了支持这种做法,App Engine 需要预先了 解哪些实体将一起更新,从而使用支持事务的方式来存储这些实体。您在创建实体时, 必须声明这一实体与另一实体同属一个实体组。在一个事务中抓取、创建、更新或删除 的所有实体都必须位于同一实体组中。 实体组是由实体之间关系的层次结构定义的。要在组中创建实体,您应声明该实体是组 中现有的另一实体的子实体。另一实体为父实体。不通过父实体创建的实体是根实体。 如果一个根实体没有任何子实体,则其所在的实体组中只有这一个实体。每个实体都有 一条从根实体到其自身的父实体-子实体关系路径(最短的路径没有父实体)。该路径 是实体完整键中必不可少的一部分。完整的键可以用路径中各实体的类型以及 ID 或键 名来表示。 数据存储区使用开放式并发来管理事务。在一个应用程序实例将更改应用到实体组中的 实体时,对于该组中任何实体的所有其他更新尝试都会立即失败。应用程序可再次尝试 事务,将其应用到更新的数据
配额和限制 对于数据存储区APⅠ的每次调用都会计算在数据存储区 API调用配额内。请注意,有些库的调用会导致对基础数 据存储区APⅠ的多次调用。 由应用程序发送到数据存储区的数据会计算在数据发送到 (数据存储区)API配额内。应用程序从数据存储区接收 的数据都会计算在数据接收自(数据存储区)API配额内。 应用程序当前存储在数据存储区中的数据总量不得超过存 储的数据(可调整)配额。这包括实体属性和键,但不包 括索引。 ●数据存储区操作消耗的CPU时间不得超过以下配额 CPU时间(可调整) 数据存储区CPU时间
配额和限制 对于数据存储区 API 的每次调用都会计算在数据存储区 API 调用配额内。请注意,有些库的调用会导致对基础数 据存储区 API 的多次调用。 由应用程序发送到数据存储区的数据会计算在数据发送到 (数据存储区)API 配额内。应用程序从数据存储区接收 的数据都会计算在数据接收自(数据存储区)API 配额内。 应用程序当前存储在数据存储区中的数据总量不得超过存 储的数据(可调整)配额。这包括实体属性和键,但不包 括索引。 数据存储区操作消耗的 CPU 时间不得超过以下配额: CPU 时间(可调整) 数据存储区 CPU 时间
使用J0和」DOQL o Persistencemanager pm PMF. get( get PersistenceManager ( String query select * from"+ Employee class getName(+ where lastName Smith List< Employee> employees=(List<employee> pm. new Query(query).execute(;
使用JDO和JDOQL PersistenceManager pm = PMF.get().getPersistenceManager(); String query = " select * from " + Employee.class.getName() + " where lastName == 'Smith'" ; List<Employee> employees = (List<Employee>) pm.newQuery(query).execute();
设量JDO ●要使用JDO访问数据存储区, App engine应用程序 需进行以下设置: DO和 DataNucleus App Engine插件JAR必须位于应 用程序的war/WEB-INF/ib/目录。 命名为 jdoconfig. Xml的配置文件必须位于应用程序的 war/WEB-INF/ classes/META-INF/目录中,配置为使 JDO使用 App Engine数据存储区 项目的构建过程必须对编译的数据类执行后编译“增强” 步骤以使其与jO实现相关联 ●如果使用的是 Eclipse google插件,则以上三项已为 处理
设置 JDO 要使用 JDO 访问数据存储区,App Engine 应用程序 需进行以下设置: JDO 和 DataNucleus App Engine 插件 JAR 必须位于应 用程序的 war/WEB-INF/lib/ 目录。 命名为 jdoconfig.xml 的配置文件必须位于应用程序的 war/WEB-INF/classes/META-INF/ 目录中,配置为使 JDO 使用 App Engine 数据存储区。 项目的构建过程必须对编译的数据类执行后编译“增强” 步骤以使其与 JDO 实现相关联。 如果使用的是 Eclipse Google 插件,则以上三项已为 处理
预先准备的类 ●Empl oyee @Primary Key .@ Persistent(value Strategy Id Generator Strategy. IDENTITY private Long idi a Persistent private String firstName; @Persistent private String lastName; @Persistent private Date hireDate;
预先准备的类 Employee @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id; @Persistent private String firstName; @Persistent private String lastName; @Persistent private Date hireDate;