Google App Engine的Datastore的使用

分类:Tech | 作者:Shoopman | 发表于2009/04/26 没有评论  

    GAE的Datastore是基于Big Table的,号称是面向对象的数据库(object-oriented database),而不是关系数据库。因此,Datastore是有非常大的局限性的,至少对于熟悉使用关系数据库或SQL的人来说。

1.查询操作符

查询操作符只支持<, <=, ==, >=, >
支持 !=, IN, LIKE
操作符后面只能跟常量值,不能引用实体的属性
在一个查询里,只允许一个属性使用非等于的操作符(<, <=, >=, >)

2.逻辑操作符

支持 AND(&&)
不支持 OR, NOT

3.排序

在一个查询里,使用了非等于操作符的属性必须在ORDER BY从句必须是在第一位

4.不支持关联查询

不支持JOIN

5.不支持集合函数

不支持group by, having, sum, avg, max, min 

其他的以后发现了再补充。

参考:GAE Datastore Queries and Indexes

Tag:

Google App Engine SDK 有更新了–DataNucleus App Engine plugin RC1

分类:Tech | 作者:Shoopman | 发表于2009/04/23 没有评论  

    Google App Engine SDK 有更新了!不过这次释出的只是DataNucleus App Engine plugin,是GAE for Java中的持久层框架,支持JPA和JDO。版本号是1.0.1 Release Candidate 1,下载地址在是:http://datanucleus-appengine.googlecode.com/files/appengine-orm-1.0.1.RC1.zip。这个发布只要是bug fixed,详细的bug fixed 请查看这里。还需要注意的是,这不是官方正式发布的,详细内容请看Google Group。如果以后想查看更多版本的DataNucleus plugin for Google App Engine,可以到这里:http://code.google.com/p/datanucleus-appengine/downloads/list

1.备份Google App Engine SDK
把\plugins\com.google.appengine.eclipse.sdkbundle_1.2.0.v200904062334\appengine-java-sdk-1.2.0这个目录备份

2.下载DataNucleus App Engine plugin 1.0.1RC1
地址是http://datanucleus-appengine.googlecode.com/files/appengine-orm-1.0.1.RC1.zip

3.把下载的ZIP压缩包解压并覆盖到\plugins\com.google.appengine.eclipse.sdkbundle_1.2.0.v200904062334\appengine-java-sdk-1.2.0

4.移除旧版本的DataNucleus App Engine plugin的jar包
删除\plugins\com.google.appengine.eclipse.sdkbundle_1.2.0.v200904062334\appengine-java-sdk-1.2.0\lib\user\orm\datanucleus-appengine-1.0.0.final.jar

5.重启Eclipse

Tag:

在国外注册域名的经历

分类:Internet | 作者:Shoopman | 发表于2009/04/21 没有评论  

    关于shoopman.co.cc域名的问题,co.cc给我回来邮件,但是他们的建议也是行不通的。继续在co.cc上找FAQ,却看到了这个免费域名,只是第一年免费使用,以后要使用就要交钱了。想了想,还是自己申请一个顶级域名算了,反正一年也就几十RMB或者几美刀。 

    在网上查了一下相关问题,决定使用美刀在国外注册域名,原因有:不需要备案,域名管理自由度更大。可是Google App已经彻底不支持cn域名绑定了,原来的cn改CN这漏洞估计在ZF的压力下已经给堵上了,连cN和Cn也不行了。看来只好放弃cn,改用其他域名了。

    根据网上的资料,我开始在GoDaddy上注册域名。GoDaddy网速比较慢,但也只好忍了。一步一步的注册帐号,选择域名,付款—-出问题了!Paypal无法支付!赶紧继续在网上找原因:原来我的是贝宝帐号,而不是Paypal;贝宝只能在国内使用,不能通过信用卡向国外支付。于是觉得Paypal太恶心了,都是www.paypal.com这个网址,可居然有两套用户体系;虽然是有历史原因的,但不能想办法整合整合吗?

    抱怨归抱怨,还得重新注册Paypal帐号好完成这笔支付。直接通过信用卡虽然也可以支付,但月光博客的亲身经历却让我取消了这个念头。顺利申请了Paypal帐号后,关联信用卡时却又卡住了—-Paypal要从我的招行信用卡先扣去$1.95,待关联验证后归还到Paypal帐号里。这$1.95是不用想拿回来了,Paypal的客服说需要Paypal余额需要达到$150后才能提现。神啊,有没有$1.95的东西,好让我花了它啊!Paypal客服还说了,信用卡不需要等待关联验证后,即可付款。我汗,我还傻傻的等了好半天啊!继续回到GoDaddy支付,可是依然不成功:
Transaction refused due to risk model (10205)  
There was a problem authorizing your credit. Please verify your payment information or use an alternate form of payment.
Please click here to go back and confirm that your information is correct.
按照IDCSpy帖子里的说法,往Paypal帐号里又添加了一张招商银行的储蓄卡,还是一样的支付失败。相当郁闷啊,看来只有选择IDCSpy的代购了,通过支付宝给他们支付的RMB,IDCSpy给我发相应美刀的GoDaddy Gift Card Code。$7.69,汇率按7算,折合成人民币不到60块,支付大概5个小时后,就收到了GoDaddy Gift Card Code,动作还是相当快的。只是可怜我那$1.95,白送给Paypal了。
Tag:

JavaEye被挂马了?

分类:Internet | 作者:Shoopman | 发表于2009/04/21 没有评论  

在Google Reader中看了JavaEye新闻里的关于“Oracle收购Sun”的消息,发现Javaeye上的同志讨论可真积极,评论都60多条了,于是点击进去想看看他们的高见。可是浏览器却短暂的没有了响应,而后弹出了一个ActiveX控件被拒绝安装的提示,接着360安全卫士也来了:“拦截到一个木马或恶意广告页面”,而Javaeye的页面则是一片乱码:

也许是JavaEye近年发展太快了,树大招风;也许是robin有时稍微尖锐的言论又得罪了小人。。。希望JavaEye能早点恢复。

Tag:

shoopman.co.cc莫非就没用了?

分类:Internet | 作者:Shoopman | 发表于2009/04/20 1条评论 

    因为Google App现在已经不支持绑定裸域了,而我也只是拥有shoopman.co.cc这个域名而不是co.cc,所以我也没有办法直接绑定shoopman.co.cc到shoopmanlog.appspot.com上来,只好新建www.shoopman.co.cc这个三级子域名来绑定了。

    在co.cc的域名管理里,Name Server(域名解析服务器?)、Zone Records(A/MX/CNAME)和URL Forwording(URL转发)是互斥的,只能三选一。www.shoopman.co.cc这个子域名已经添加了一个类型为A记录的Zone Record了,而类型为NS的Zone Record又不能用在shoopman.co.cc这个域名上。如果重新设置shoopman.co.cc的Name Server或者URL Forwording,Zone Records会全部被删掉。。。

    4.18晚,就这个问题,我已经发了封邮件给co.cc,希望他们能看得懂我的E文。。。可是现在还没有收到回复。

    唉。。。不知还有没有其他办法。

Tag:

解决Google App Engine中的DatastoreNeedIndexException异常

分类:Tech | 作者:Shoopman | 发表于2009/04/18 没有评论  

    做了一个简单的一对一(OneToOne)关系的JPA测试,在本地Eclipse中没有问题,但部署到GAE后,添加数据成功而在显示数据的时候却报500错误。幸好GAE控制台有详细错误日志:

/oneone.jsp
java.lang.ClassCastException: com.google.appengine.api.datastore.DatastoreNeedIndexException cannot be cast to javax.servlet.ServletException
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:754)
at org.apache.jsp.oneone_jsp._jspService(oneone_jsp.java:100)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

看来是忘记给datastore指定,参看GAE的文档Queries And Indexes,赶紧在WEB-INF添加datastore-indexes.xml,再把本地自动生成的index(在WEB-INF/appengine-generated/datastore-indexes-auto.xml中)的内容复制进去,如下:


 xmlns=”http://appengine.google.com/ns/datastore-indexes/1.0
 autoGenerate=”true”>
       source=”auto” />

重新部署到GAE中,运行正常。

测试地址:http://shoopmanga.appspot.com/oneone.jsp

Tag:

给Google App Enging绑定域名

分类:Internet | 作者:Shoopman | 发表于2009/04/18 没有评论  

前段时间申请了一个免费的二级域名shoopman.co.cc(关于co.cc的中文介绍可以点这里,申请地址在http://www.co.cc),在Google App Engine部署了用python写的Blog后,当然也想绑定这个短小的域名到这个Blog上,于是开始了折腾:

1.进入Google App Engine管理中心,选择安装了博客的的应用ID,我这个是“shoopmanlog”,在应用控制台里,点左边的导航菜单的“Version”。
2.在Version页输入了我申请的免费域名”shoopman.co.cc”,点击“Add Domain”按钮,页面居然却跳到了Google App(Google企业应用套件)的注册页。
3.按照Google App的提示,成功申请了一个Google App的帐号。需要注意的是,Google App暂时不支持中国地区,换一个地区比如美国,就能成功申请了。
4.根据Google App的提示,需要验证域名是属于我的。登录http://www.co.cc的域名管理,在Zone Record里添加一个CNAME记录googleffffffffe3f97a51.shoopman.co.cc,指向google.com。
5.切换回到Google App中,点击“验证”按钮,Google提示在48个小时内完成验证。
6.我没有那么大的耐心等48小时再做下一步操作,直接到Google App添加Google App Engine服务,如图
7.在服务设置菜单中给Google App Engine服务添加域名www.shoopman.co.cc,Google App提示要把相应域名的CNAME指向
ghs.google.com,但网上的一些文章说由于ghs.google.com被墙(GFW)了,需要设置域名的A记录到相应的IP。这个IP我是从xuming.net找来的,PING一下www.shoopman.co.cc就可以看到了,呵呵。
8.等待吧,耐心等待域名解析生效吧。。。我的大概是4、5个小时后就生效了,哦也!
Tag:

Google App Engine 支持 Spring-ORM(2.5.6) 的办法

分类:Tech | 作者:Shoopman | 发表于2009/04/15 没有评论  

GAE不支持spring-orm是因为引用了javax.naming包里的类,而这些类是不被GAE支持的。在spring-orm-2.5.6.jar移去一下类则可:

PersistenceAnnotationBeanPostProcessor.class
PersistenceAnnotationBeanPostProcessor$PersistenceElement.class
PersistenceAnnotationBeanPostProcessor$2.class
PersistenceAnnotationBeanPostProcessor$1.class

这个我还没有验证过。出自Google Group

Tag:

Google App Engine 支持 Struts2 的 办法

分类:Tech | 作者:Shoopman | 发表于2009/04/15 没有评论  

如果直接在webapp的classpath加入Struts2的相关jar,Struts2是不能正常工作的。现在安一下办法就可以了:

1.首先写这样一个类:

package com.ociweb.gaestruts2;

// imports

public class InitListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {

public InitListener()  {
}

public void contextInitialized(ServletContextEvent sce)  {
OgnlRuntime.setSecurityManager(null);
}
// … all other methods stubbed out to do nothing
}

2.在web.xml中加入如下代码:

com.ociweb.gaestruts2.InitListener

我已经验证过了。原文出自Google Group

Tag:

解决Tomcat在WTP出现的java.lang.OutOfMemoryError问题

分类:Tech | 作者:Shoopman | 发表于2009/04/15 没有评论  

现在项目开发工具用的是eclipse ganymede for jee,自带了WTP。开发期间,webapp是部署到tomcat里。由于某些原因,tomcat用的还是5.0.28版。

现在这个webapp引用了一堆有用没用的jar,共计142个50多M。于是问题来了,当tomcat启动后,访问一个jsp,控制台报了类似一下的异常:

2009-02-05 17:30:32,125 ERROR [org.apache.jasper.compiler.Compiler] -
Compile failed; see the compiler error output for details.
at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:944)
at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:764)
at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:382)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:472)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
… …
2009-02-05 17:30:32,125 ERROR [org.apache.jasper.compiler.Compiler] -
classpath=/D:/Tomcat/webapps/cos/WEB-INF/classes/;
/D:/Tomcat/webapps/cos/WEB-INF/lib/activation.jar;
(D:/Tomcat/webapps/cos/WEB-INF/lib下的所有jar包)
… …

2009-02-05 17:30:32,125 ERROR [org.apache.jasper.compiler.Compiler] -
系统资源不足。
有关详细信息,请参阅以下堆栈追踪。
java.lang.OutOfMemoryError: Java heap space

解决办法:菜单RunDebug Configurations打开Debug配置窗口,在左边选中所用的Tomcat Server,再在右边切换到Arguments,在VM arguments中加入参数如“-Xms128m -Xmx256m”,来设置Tomcat使用的JVM的内存大小,如下图,接着点“Apply”按钮保存设置吧。