GAE
(Google App Engine)是目前最受欢迎的云计算平台之一。特别是其对JAVA
的支持,更是让许多人为之振奋。GAE
的文档还算是比较丰富,不过仍然有一些让人迷惑的地方,本文将这些地方一一作出总结和说明,希望对GAE
开发者有所帮助。
GAE
支持JAVA
和Python
(以后或许支持更多的)。这里仅讨论JAVA
。
JSP
方面:
GAE
支持JSP
页面,但是默认并不启用JSTL
和EL
表达式,很多开发者嵌入EL
后发现出现奇怪的结果。若要启用JSTL
,则需要做下面几个工作:
1
,每个JSP
顶部,加入以下语句
<
%@ page
contentType
="text/html; charset=UTF-8"
language
="java"
pageEncoding
="UTF-8"
isELIgnored
="false"%
>
< %@ taglib prefix ="c" uri ="http://java.sun.com/jsp/jstl/core" % >
< %@ taglib prefix ="c" uri ="http://java.sun.com/jsp/jstl/core" % >
2
,将web.xml
文件头部修改为以下形式,这一步也很重要, 网上现在有很多文章只说明了第一步,事实上还需要这一步。
<
web-app
version
="2.4"
xmlns
="http://java.sun.com/xml/ns/javaee"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd" >
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd" >
这两步完成以后即可使用JSTL
了。
Web
方面:
1
,默认情况下GAE
并不启用Session
。若要使用之,则需修改/Web-INF/appengine-web.xml
文件,在根元素下加入这样的语句
<
application
>
< sessions-enabled >true </ sessions-enabled >
</ application >
< sessions-enabled >true </ sessions-enabled >
</ application >
另外一个需要注意的就是,尽量不要在Session
中储存数据量较大的数据,这样做很可能会导致数据不同步的情况(这种现象很难调试)。一般来说仅仅在Session
中放入一个标志(Key
)即可,主体的数据应持久化或者放入memcache
。不过有时memcache
会因为某种原因比如服务器负载太高而失效,所以若这种现象是不可忍受的,则还是进行持久化比较保险。
2
,每次请求时间必须控制在30sec
以内,若超过这个时间GAE
会自动终止该次请求。最消耗CPU
时间的是数据库操作。
数据持久化方面:
GAE
使用JDO
或者JPA
来进行数据持久化。和传统的关系型数据库相比,这种储存方法似乎更适合于互联网应用。一般来说,JDO
的使用非常简单,不过这里仍然存在大量的陷阱,同样也是难以调试发现的。
1
,每个欲持久化的类均必须有一个主键。主键不能是基本类型,只能装箱使用。最常见的就是Long
(不要写成long
)。
2
,类之间尽量不要耦合
,如Employee
类中含有一个对Profile
类的引用,这样也会导致持久化失败。虽然GAE
文档中有说明可以通过某种方式来支持,不过我试验的结果表明还是难以使用。因而如果要耦合,则应使用一个普通的字段储存被耦合类的主键即可。查询的时候根据这个主键再作一次查询。为了提高性能,可以将查询出来的数据放入memcache
中,这样可以减少查询次数。
3
,由于查询操作比较消耗CPU
,所以应尽量减少查询次数。为此可以使用DTO
(Data Transfer Object
)模式
,将多个领域对象组装为一个DTO
对象进行持久化;查询的时候一次性查出所需的数据,然后再分解DTO
。
4
,GAE
不支持对 Map
类型的集合类进行持久化
。
5
,在本地进行GAE
项目调试的时候,默认的数据库位置是/WEB-INF/appengine-generated/local_db.bin
。特别需要注意的是每次重新启动服务器并不会自动删除数据库中已有的内容。可以手动删除之以达到数据清空的目的。
转载于:https://blog.51cto.com/spinlock/487213