您好,欢迎访问三七文档
当前位置:首页 > 高等教育 > 工学 > 复旦大学高级web技术课件09云计算之GAE
内容GAE概述GAE应用的限制数据持久化技术数据库访问:JDOQL和GQL应用层技术JavaGAE服务GAE单元测试学习资料:架构GAE概述GoogleAppEngine可让开发者在Google的基础架构上运行您的网络应用程序。AppEngine应用程序易于构建和维护,并可根据运行者的访问量和数据存储需要的增长轻松扩展。使用GoogleAppEngine,将不再需要维护服务器:运行者只需上传应用程序,它便可立即为用户提供服务。GoogleAppEngine支持以几种编程语言编写的应用程序。Python和Java在AppEngine中,运行者只需为使用的资源付费。可以免费开始使用AppEngine。所有应用程序都可以使用多达500MB的存储空间,以及可支持每月约500万页面浏览量的足够CPU和带宽,完全免费。GAE特性动态网络服务,提供对常用网络技术的完全支持持久存储空间,支持查询、分类和事务自动扩展和负载平衡用于对用户进行身份验证和使用Google帐户发送电子邮件的API一种功能完整的本地开发环境,可以在开发者计算机上模拟GoogleAppEngine用于在指定时间和定期触发事件的计划任务GAE应用的限制带宽和CPU配额限制请求大小10兆字节响应大小10兆字节请求持续时间30秒同时动态请求30*应用程序文件的最大数目1,000静态文件的最大数目1,000应用程序文件的最大规模10兆字节静态文件的最大大小10兆字节所有应用程序和静态文件的最大总大小150兆字节GAE数据持久化技术AppEngine提供了一个强大的分布式数据存储服务,其中包含查询引擎和事务功能。就像分布式网络服务器随访问量增加一样,该分布式数据存储区也会随数据而增加。该AppEngine数据存储区与传统关系数据库不同。数据对象(或“实体”)有一类和一组属性。查询可以检索按属性值过滤和分类的指定种类的实体。属性值可以是受支持的属性值类型中的任何一种。数据存储区实体是“无架构”的。数据实体的结构由应用程序代码提供和执行。JavaJDO/JPA接口和Python数据存储区接口包括用于在您的应用程序内应用和执行结构的功能。您的应用程序还可以直接访问数据存储区以根据需要应用或多或少的结构。数据存储区高度一致并使用乐观并发控制。如果有其他进程尝试更新某实体,而同时该实体位于以固定次数进行重新尝试的事务中,此时该实体将更新。应用程序可以在一个事务中执行多项数据存储区操作(全部成功或者全部失败,从而确保数据的完整性)。数据存储区通过其分布式网络使用“实体组”实现事务。一个事务操作一个组内的实体。同一组的实体存储在一起,以高效执行事务。应用程序可以在实体创建时将实体分配到组。数据存储区AppEngine数据存储区存储数据对象(称为“实体”)并对其执行查询。一个实体具有一个或多个属性(若干受支持数据类型中某一类型的命名值)。属性可以是对另一实体的引用。数据存储区可以在一个事务中执行多个操作,如果任一操作失败则回滚整个事务。这对于分布式网络应用程序尤其有用,在这种分布式网络应用中,多个用户可以同时访问或处理同一数据对象。与传统数据库不同,该数据存储区使用分布式体系结构管理向超大型数据集的扩展。AppEngine应用程序可以通过描述数据对象之间的关系,以及定义查询的索引,来优化数据的分布方式。AppEngine数据存储区具有高度的一致性,但不是关系数据库。虽然该数据存储区接口有许多与传统数据库相同的功能,但也具有独特的特征,它采用了不同的数据设计和管理方式,可以充分利用自动扩展功能。实体和属性AppEngine数据存储区中的数据对象称为实体。一个实体具有一个或多个属性(若干数据类型中某一类型的命名值),包括整数值、浮点值、字符串、日期、二进制数据等。每个实体还有一个唯一标识该实体的键。最简单的键具有数据存储区提供的类型和唯一的数字ID。ID还可以是应用程序提供的字符串。应用程序可以使用实体的键或执行与实体属性匹配的查询,从数据存储区中抓取实体。查询可以返回零个或多个实体,并可以返回按属性值排序的结果。查询还可以限制数据存储区返回的结果的数量,以节省内存和运行时间。与关系数据库不同,AppEngine数据存储区不要求指定类型的所有实体要有相同的属性。应用程序可指定并强制其数据模型使用SDK附带的库或其自己的代码。一个属性可具有一个或多个值。具有多个值的属性可具有混合类型的值。对具有多个值的属性进行查询可测试是否有任何值满足查询条件。这样可以使这些属性能够用于测试成员身份。查询和索引AppEngine数据存储区查询对某一指定类型(数据类)的每个实体进行操作。它对实体属性值和键指定零个或多个过滤条件,以及零个或多个排序顺序。如果一个实体对于查询的过滤条件和排序顺序中所提及的每个属性都具有至少一个值(可能为null),且属性值满足所有过滤条件,那么将返回该实体作为查询的结果。每个数据存储区查询都使用一个索引,即包含按指定顺序排列的查询结果的表格。AppEngine应用程序会在一个配置文件中定义其索引。开发网络服务器在遇到未配置索引的查询时会自动为该文件添加建议。您可以在上传该应用程序之前编辑该文件,以手动调整索引。当应用程序对数据存储区实体做出更改时,数据存储区会使用正确的结果更新索引。当应用程序执行查询时,数据存储区会直接从相应的索引中抓取结果。该机制可支持许多查询,且适用于大部分应用程序。然而,该机制不支持您可能惯用的其他数据库技术中的一些查询类型。事务和实体组在AppEngine数据存储区中,所有创建、更新或删除实体的尝试都可以在一个事务中进行。事务可确保对实体所做的所有更改都保存到数据存储区中,或者,在失败的情况下不做任何更改。这样便可确保实体中数据的一致性。您可以使用事务API在单一事务中对一个实体执行多个操作。例如,假设您要使对象中的计数器域递增。为此,您需要读取计数器的值,计算新的值,然后存储值。如果没有事务,那么在您读取值和更新值之间,可能有另一进程使计数器递增,这会导致应用程序覆盖已更新的值。在单一事务中进行读取、计算和写入操作可确保没有其他进程干扰递增。您可以在单一事务中对多个实体进行更改。为了支持这种做法,AppEngine需要预先了解哪些实体将一起更新,从而使用支持事务的方式来存储这些实体。您在创建实体时,必须声明这一实体与另一实体同属一个实体组。在一个事务中抓取、创建、更新或删除的所有实体都必须位于同一实体组中。实体组是由实体之间关系的层次结构定义的。要在组中创建实体,您应声明该实体是组中现有的另一实体的子实体。另一实体为父实体。不通过父实体创建的实体是根实体。如果一个根实体没有任何子实体,则其所在的实体组中只有这一个实体。每个实体都有一条从根实体到其自身的父实体-子实体关系路径(最短的路径没有父实体)。该路径是实体完整键中必不可少的一部分。完整的键可以用路径中各实体的类型以及ID或键名来表示。数据存储区使用开放式并发来管理事务。在一个应用程序实例将更改应用到实体组中的实体时,对于该组中任何实体的所有其他更新尝试都会立即失败。应用程序可再次尝试事务,将其应用到更新的数据。配额和限制对于数据存储区API的每次调用都会计算在数据存储区API调用配额内。请注意,有些库的调用会导致对基础数据存储区API的多次调用。由应用程序发送到数据存储区的数据会计算在数据发送到(数据存储区)API配额内。应用程序从数据存储区接收的数据都会计算在数据接收自(数据存储区)API配额内。应用程序当前存储在数据存储区中的数据总量不得超过存储的数据(可调整)配额。这包括实体属性和键,但不包括索引。数据存储区操作消耗的CPU时间不得超过以下配额:CPU时间(可调整)数据存储区CPU时间使用JDO和JDOQLPersistenceManagerpm=PMF.get().getPersistenceManager();Stringquery=select*from+Employee.class.getName()+wherelastName=='Smith';ListEmployeeemployees=(ListEmployee)pm.newQuery(query).execute();设置JDO要使用JDO访问数据存储区,AppEngine应用程序需进行以下设置:JDO和DataNucleusAppEngine插件JAR必须位于应用程序的war/WEB-INF/lib/目录。命名为jdoconfig.xml的配置文件必须位于应用程序的war/WEB-INF/classes/META-INF/目录中,配置为使JDO使用AppEngine数据存储区。项目的构建过程必须对编译的数据类执行后编译“增强”步骤以使其与JDO实现相关联。如果使用的是EclipseGoogle插件,则以上三项已为处理。预先准备的类Employee@PrimaryKey@Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)privateLongid;@PersistentprivateStringfirstName;@PersistentprivateStringlastName;@PersistentprivateDatehireDate;创建数据PersistenceManagerpm=PMF.get().getPersistenceManager();Employeee=newEmployee(Alfred,Smith,newDate());try{pm.makePersistent(e);}finally{pm.close();}键每个实体都具有一个在AppEngine的所有实体中唯一的键。一个完整的键包含若干条信息,其中包括应用程序ID、类型和实体ID。对象的键存储在实例的某一个字段中。开发者可以使用@PrimaryKey批注来标识主键字段。应用程序可在创建对象时以字符串形式提供键的ID部分,也可以允许数据存储区自动生成数字ID。完整的键在数据存储区的所有实体中必须是唯一的。换句话说,在类型相同且具有相同父实体组(如果有)的所有对象中,一个对象必须具有唯一的ID。您可以使用字段类型和批注来选择所需的键的行为。通过键获取对象Keyk=KeyFactory.createKey(Employee.class.getSimpleName(),Alfred.Smith@example.com);Employeee=pm.getObjectById(Employee.class,k);更新对象使用JDO更新对象的一种方式是抓取对象,然后在返回该对象的PersistenceManager仍然处于打开状态的情况下对该对象进行修改。当关闭PersistenceManager时,会保留修改。publicvoidupdateEmployeeTitle(Useruser,StringnewTitle){PersistenceManagerpm=PMF.get().getPersistenceManager();try{Employeee=pm.getObjectById(Employee.class,user.getEmail());if(titleChangeIsAuthorized(e,newTitle){e.setTitle(newTitle);}else{thrownewUnauthorizedTitleChangeException(e,newTitle);}}finally{pm.close();}}删除对象要将对象从数据存储区中删除,请对该对象调用Pers
本文标题:复旦大学高级web技术课件09云计算之GAE
链接地址:https://www.777doc.com/doc-10674046 .html