`
edison0951
  • 浏览: 71961 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

转 关于GAE你可能不知道的十件事

阅读更多
# 程序版本号并不是number类型而是string
尽管在多数的例子中都将app.yaml和appengine-web.xml中的'version'字段作为number类型,实际上这只是人们的一种习惯。程序版本可以是任何URL中允许的string类型。例如,你可以将你的版本设置成"live"和"dev",这样你就可以通过"live.latest.yourapp.appspot.com"和"dev.latest.yourapp.appspot.com"这样的地址来访问了。
# 你可以在程序中同时使用多个版本
这里有一点是很NB的,不同的版本可以使用不同的运行环境。换言之,你可以为你的程序开发使用Java语言的版本和Python语言的版本。
# Java运行时支持任何编译成Java bytecode的语言
这就是为什么人们需要Java runtime的原因,一旦这家伙被支持了就等于你可以在GAE上使用什么JRuby,Groovy,Scala,Rhino(JavaScript编译器),Quercus(PHP编译器),甚至Jython!
# 使用'IN'和'!='运算符可以生成多重数据查询
例如,查询"SELECT * FROM People WHERE name IN ('Bob', 'Jane')"将会被编译成两个查询等价于使用"SELECT * FROM People WHERE name = 'Bob'"和"SELECT * FROM People WHERE name = 'Jane'"并合并查询的结果。
查 询"SELECT * FROM People WHERE name IN ('Bob', 'Jane') AND age != 25"将会为每种可能生成生成查询,(age小于或者等于25, 和name是否为'Bob'或者'Jane'),然后将每种可能合并成结果。
# 你可以使用批处理执行put,get和delete操作来提高效率。
每当你做出一个数据请求,比如一个查询或者get() 操作,你的程序将会对数据库发出请求,而数据库将会执行这些操作并返还一个response。请求到响应的循环过程将会花费一定时间,所以如果你执行的请求过多的话将会导致用户等待结果的时间过长(万恶的datastore timeout: operation took too long异常)。
很幸运的是,GAE提供一个简单的方法来减少数据查询中的这种循环:比处理操作。db.put(),db.get(),和 db.delete()函数都可以接受可选的list参数来执行操作。当一个传递一个list以后这些操作将会并行的遍历list的每一个元素,这样就大大节省了操作的时间。例如:

for entity in MyModel.all().filter("color =",
    old_favorite).fetch(100):
  entity.color = new_favorite
  entity.put()

更新操作需要一个数据库往返的查询,还需要加上一次操作来更新数据库中实体的属性————也就是说一共需要101次的往返!再看下面的例子:

updated = []
for entity in MyModel.all().filter("color =",
    old_favorite).fetch(100):
  entity.color = new_favorite
  updated.append(entity)
db.put(updated)

这个例子中只需要2次数据库往返,也就是说我们将101次往返减少到了2次。
# 数据库的性能并不取决于其中实体的数量
# 建立索引的时间开销并不全部取决于它的大小
# 'Stored Data'的值是按日更新的
# app.yaml,web.xml和appengine-web.xml中指明了项目的处理顺序
人们经常犯的一个错误时忘记配置程序处理文件的顺序是自上而下的。比如,当使用remote_api时候很多人这样做:

handlers:
- url: /.*
  script: request.py

- url: /remote_api
  script: $PYTHON_LIB/google/appengine/ext/remote_api/handler.py
  login: admin

上面的例子看起来没有什么问题,但是由于handler是按照顺序处理的,request.py是首先出现的,而所有请求包括对 remote_api的请求都是使用request.py处理的。由于request.py加载后并没有出现remote_api,所以就会造成a 404 Not Found error的错误。解决的方法是将request.py的handler放置到remote_api的handler下面。在Java环境的配置文件中也是一样。
# 你不需要手动构造GQL字符
下面是一个反例:

q = db.GqlQuery("SELECT * FROM People "
    "WHERE first_name = '" + first_name
    + "' AND last_name = '" + last_name + "'")

很幸运,GAE支持在GqlQuery语句中使用参数替换,上面例子可以改写成:

q = db.GqlQuery("SELECT * FROM People "
    "WHERE first_name = :1 "
    "AND last_name = :2", first_name, last_name)

GqlQuery还支持使用name来代替数字参数:

q = db.GqlQuery("SELECT * FROM People "
    "WHERE first_name = :first_name "
    "AND last_name = :last_name",
    first_name=first_name, last_name=last_name)

这样做出了能使代码看起来更加简洁以外,还可以进行一些优化。如果你需要使用不同的值来进行多次同样的查询,你可以使用bind()函数来为每个查询重新绑定参数。这比起每次都要构造新的查询更加快捷,因为查询只需要分析一次:

q = db.GqlQuery("SELECT * FROM People "
    "WHERE first_name = :first_name "
    "AND last_name = :last_name")
for first, last in people:
  q.bind(first, last)
  person = q.get()
  print person
分享到:
评论

相关推荐

    基于GAE的Demo

    【基于GAE的Demo】是一个使用Eclipse集成开发环境构建的项目,主要展示了如何在Google App Engine(GAE)平台上整合Struts2、Spring和Tiles框架。GAE是Google提供的一个云计算平台,允许开发者在Google的基础设施上...

    GAE使用规则

    GAE使用规则GAE使用规则GAE使用规则GAE使用规则GAE使用规则GAE使用规则GAE使用规则GAE使用规则GAE使用规则

    关于GAE的教程、工具与文档(建站)

    **谷歌应用引擎(Google App Engine, GAE)**是谷歌提供的一种云计算平台,允许...在压缩包文件中,可能包含的资源有GAE的官方文档、教程、示例代码以及可能的第三方库和工具,这些都是进一步学习和开发的重要资料。

    GAE入门教程

    pass之GAE入门教程, 学习GAE

    gae-pytorch-master_pytorch_pytorchgae_GAE_自编码器_gaepytorchmaster_

    【标题】"gae-pytorch-master_pytorch_pytorchgae_GAE_自编码器_gaepytorchmaster_" 提供的信息表明,这是一个使用PyTorch实现的图自编码器(Graph Autoencoder, GAE)项目,其核心是将自编码器的概念应用于图数据。...

    gae_in_pytorch-master_GAE_

    **图形自动编码器(GAE)在PyTorch中的实现** **一、GAE概述** 图形自动编码器(Graph ...通过这个项目,你可以深入理解GAE的原理,掌握图神经网络在图结构学习中的应用,并且能够针对具体任务进行模型的调整和优化。

    spring+gae

    【标题】"Spring+GAE"揭示了将Google App Engine(GAE)与Spring框架集成的主题,这是一个在云端运行Java应用程序的关键技术组合。Spring是一个广泛使用的开源Java框架,提供了依赖注入、面向切面编程和MVC(模型-...

    GAE包(以配置好,解压可用)

    对于初学者或者不熟悉GAE配置的开发者来说,这是一个非常方便的起点,可以快速进入开发阶段,无需了解和处理GAE的环境设置、依赖管理和网络配置等复杂问题。 根据压缩包子文件的文件名称列表 "gae",我们可以推测这...

    GAE blog安装

    标题“GAE blog安装”指的是在Google App Engine (GAE)上部署一个博客应用的过程。GAE是一个由Google提供的平台即服务(PaaS)云环境,允许开发者构建、运行和维护Web应用程序,无需管理和维护底层基础设施。在这个...

    GAE之webapp框架

    ### GAE之webapp框架详解 #### 一、引言 在Google App Engine (GAE) 平台上进行Web应用开发时,选择合适的框架对于提高开发效率至关重要。其中,`webapp` 框架因其简洁高效而备受开发者青睐。本篇文章将详细介绍`...

    GAE read rss send to 腾讯微博

    标题“GAE read rss send to 腾讯微博”指的是一个使用Google App Engine(GAE)平台开发的应用程序,该程序的功能是从RSS源读取数据并将其发布到腾讯微博。RSS(Really Simple Syndication)是一种内容聚合格式,常...

    GAE编程指南

    《GAE编程指南》是一种云计算服务,跟其他的同类产品不同,它提供了一种简单的应用程序构建模型,通过这种模型,你可以轻松地构建出能够容纳数百万用户的应用程序。《GAE编程指南》是介绍使用这个强大平台的专家级...

    让gae支持php的方法

    1. **安装和配置Quercus**:首先,你需要下载Quercus的Java库,并将其添加到你的GAE项目类路径中。这可以通过在你的项目`lib`目录下放置Quercus的JAR文件来完成。 2. **构建PHP处理程序**:创建一个Java类作为PHP...

    GAE和SAE的比较

    云计算下的PaaS中的GAE和SAE平台

    gtap,基于GAE的代理

    标题中的“gtap,基于GAE的代理”指的是一个名为GTAProxy的项目,它是一个构建在Google App Engine(GAE)平台上的代理服务。这个服务的主要目的是为用户提供访问Twitter API的能力,尤其在某些地区或者特定网络环境...

    gae编程指南

    《GAE编程指南》是一种云计算服务,跟其他的同类产品不同,它提供了一种简单的应用程序构建模型,通过这种模型,你可以轻松地构建出能够容纳数百万用户的应用程序。《GAE编程指南》是介绍使用这个强大平台的专家级...

    GAE上可以用的JAVA 博客源代码

    GAE上可以用的JAVA Blog源代码 可以在GAE上直接使用,支持图片上传等。 源代码是修改其他网友的普通blog程序而来,只做了必要的修改,原结构保留 最新版本请去主页下载 http://redpower1998.appspot.com 主页包括...

    GAE扩展样例程序

    【标题】"GAE扩展样例程序"是一个针对Google App Engine (GAE) 平台的EGL(Enterprise Generation Language)扩展项目。这个程序的主要目的是为开发者提供一个模板或者起点,帮助他们更好地理解和实践如何在GAE上...

    GAE Struts2配置

    由于GAE对第三方库有一些限制,你可能需要选择特定版本的Struts2库,避免使用与GAE不兼容的组件。 2. **Web.xml配置**:在`web.xml`文件中,你需要配置Struts2的过滤器。这通常包括一个`<filter>`元素定义Struts2的...

Global site tag (gtag.js) - Google Analytics