Google App Engine简介及限制说明

Google App Engine简单地说就是一个支持J2EE和python运行环境的免费主机空间和一个*.appspot.com的二级域名。最大的优点是免费,无论是CPU时还是带宽对于普通的小型网站都是绰绰有余的。但是GAE有很多很多的限制,主要跟大家分享一下我在GAE上做J2EE项目遇到的各种限制吧。

首先最突出的就是沙盒的运行环境,所谓沙盒,就是一个独立的运行空间,在这个空间里无论执行什么样的代码都不会对其他沙盒和整个系统造成影响。一般来说沙盒的普遍限制是不可以访问本地文件,这对GAE也是一样的,不能写文件,但是可以读随着应用程序一起上传的文件。所有的数据都要用数据库来存储和读取。

说起数据库,这是GAE让人感觉最不习惯的一个地方。GAE的数据库不是真正意义的关系数据库,是为了配合分布式GFS而用BigTable实现的类似数据库的东东。不是关系数据库,自然不能支持完整的SQL和平常在关系数据库中非常自然的一些操作。GAE上对数据的访问必须用JDO(Java Data Object)和JPA来访问,推荐使用JDO,比JPA方便不少。首先最大的限制是SQL语句只支持SELECT *和SELECT _KEY_,即只能是select操作,而且必须select全部字段或者select主键。不支持任何的insert、delete和update操作。但是可以通过JDO提供的持久层操作来实现此数据的CRUD(Create, Retrive, Update, Delete)。使用GAE平台不需要显式的定义表的scheme,只需要直接定义Data Objects。具体的定义方法可以参考GAE文档,需要注意的是主键不能是int,可以用Long(注意L是大写的)。给出一个实现了CRUD的简单DataService类:

逐个来分析,Create方法最简单,直接把传进来的DO交给持久层就行了。Retrive使用主键从持久层获取数据,但是这个数据还是属于持久层管理着的,如果关闭了PersistentManager,那么这个对象也就不存在了,所以要把这个对象detach出来。就是让其从持久层脱离出来,脱离出来的方法就是做一个深度复制,也就是detachCopy方法。Update方法尤其要注意,可以看到虽然传进来一个新的数据对象,但是不能直接把这个对象makePersistent了,否则会抛出异常。正确的操作步骤是先用新的数据对象的主键从持久层获取此对象,然后把新对象的数据赋给刚从持久层抓出来的旧对象,最后保存旧对象。旧的数据对象一直生存在持久层上,新的对象的功能只是提供数据而已。Delete方法也比较简单,直接deletePersistent就行了。

另一个非常麻烦的问题是GAE数据的limit(a, b)查询是把从0到b的对象全部查出来,然后丢弃前a个,返回后面的b-a个对象。并且,a和b的限制都是小于1000,也就是说如果用limit最多能够到的数据是2000以内。这样就引出另一个问题,如何对大量的数据做分页?我解决方案是给每一个数据添加index字段来表示其在数据库中的位置,分页可以直接在index上使用条件查询来获取。对于可能发生的数据增减和修改,每次都需要维护index的连贯性,虽然付出不小的代价,但是仍然比limit的效率高,而且能突破2000条数据的限制。

最后一个值得说说的问题是在Date类型字段上的查询,我尝试用用各种字符串的日期格式来试图在Date字段上做条件查询,都失败了。无法可想的我想出一个更好的方案:使用long存储Date类型。因为Java中每一个Date对象都可以用getTime方法返回一个唯一的long。也就是说每一个Date值都可以和一个long值唯一对应,并且互相转化。那么在数据中把数据按照long来存放,查询就简单多了:

上面的例子是查找最近几天内的评论的一个数据库查询操作,注意setFilter方法和detachCopyAll方法。

对于Date类型,还有一点要提,GAE上的时间是美国时间,我们是中国时间,又有一个时区转换的问题存在。我的解决方案是全部的Date的数据存储、逻辑操作都按照GAE上的默认时区来,只在输出Date为字符串的时候做转换:

以上是我在GAE上做这个博客的一些经验,在这里分享一下。难免有错,欢迎指正。

 

原文链接:http://hzqtcblog.appspot.com/article.jsp?articleid=dsntvawxgl

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值