【问题标题】:Unknown error in Google app engine when Quering datastore查询数据存储时 Google 应用引擎出现未知错误
【发布时间】:2012-11-03 07:16:50
【问题描述】:

我有以下代码从谷歌应用引擎的数据存储区获取值。

PersistenceManager pm = JDOUtil.get().getPersistenceManager();
Extent extent = pm.getExtent(LeaderBoard.class, true);

Query q = pm.newQuery(extent);
q.setFilter("game =='"+game+"'");
q.setOrdering("time DESC,createdDate DESC");

List<LeaderBoard> leaderBoard = (List<LeaderBoard>) q.execute();
pm.close();

但是当我尝试它给我一个奇怪的错误时,我在下面一行不熟悉。

List<LeaderBoard> leaderBoard = (List<LeaderBoard>) q.execute();

下面是堆栈跟踪。这有时会起作用。但它现在不工作。 我正在使用谷歌应用引擎和 jdo。

ERROR :java.lang.ClassCastException: org.datanucleus.query.evaluator.memory.InMemoryFailure cannot be cast to java.lang.Comparable
stackTrace  :java.lang.ClassCastException: org.datanucleus.query.evaluator.memory.InMemoryFailure cannot be cast to java.lang.Comparable
    at org.datanucleus.query.QueryUtils$3.compare(QueryUtils.java:1317)
    at java.util.Arrays.mergeSort(Arrays.java:1446)
    at java.util.Arrays.legacyMergeSort(Arrays.java:1356)
    at java.util.Arrays.sort(Arrays.java:1345)
    at org.datanucleus.query.QueryUtils.orderCandidates(QueryUtils.java:1288)
    at org.datanucleus.query.evaluator.JavaQueryEvaluator.ordering(JavaQueryEvaluator.java:471)
    at org.datanucleus.query.evaluator.JavaQueryEvaluator.execute(JavaQueryEvaluator.java:220)
    at com.google.appengine.datanucleus.query.JDOQLQuery.performExecute(JDOQLQuery.java:153)
    at org.datanucleus.store.query.Query.executeQuery(Query.java:1789)
    at org.datanucleus.store.query.Query.executeWithArray(Query.java:1666)
    at org.datanucleus.store.query.Query.execute(Query.java:1639)
    at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:221)
    at com.googlecreativelab.dao.LeaderBoardDAO.isTopScore(LeaderBoardDAO.java:68)
    at com.googlecreativelab.dao.LeaderBoardDAO.saveTopScore(LeaderBoardDAO.java:26)
    at com.googlecreativelab.service.GameDataService.processRequest(GameDataService.java:188)
    at com.googlecreativelab.service.GameDataService.doGet(GameDataService.java:290)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146)
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:447)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:454)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461)
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:703)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458)
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
    at java.lang.Thread.run(Thread.java:679)

下面是排行榜类

@PersistenceCapable
public class LeaderBoard implements Serializable {

    private static final long serialVersionUID = 3671283388721366564L;
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;
    @Persistent
    private String name;
    @Persistent
    private Integer avatar;
    @Persistent
    private String game;
    @Persistent
    private Integer time;
    @Persistent
    private Date scoredDate;

    //Setter and getters

而且我发现只有在“时间”列中存在相同值并且我试图通过“排序依据”查询对它们进行排序时才会出现错误。 例如,在数据存储中,我有两行,“时间”列的值为 955。然后我不能按顺序进行,如果它的 955、966 类似该订单查询有效。希望我说清楚了:)。 这是一个错误还是什么。我传递给游戏的值是“运行”

【问题讨论】:

  • 你能添加你的LeaderBoard类的定义吗?另外,您添加到过滤器的game 的值是多少?

标签: java google-app-engine jdo datanucleus jdoql


【解决方案1】:

因此,您启用了内存查询,但它无法评估数据存储区中的所有查询,并且您使用的内存评估器的功能无法满足该查询。 大概使用的是 GAE JDO 插件的 v2.0.x(如果能实际引用所用软件的版本就好了)。

使用 GAE JDO 插件 v2.1.1(带有 DataNucleus 3.1.x),它具有更完整的内存查询功能。

【讨论】:

  • 我没有在内存中启用查询。我不知道该怎么做。以及如何更改 gae 的 api 包?
  • 啊,好吧,当它在数据存储中发现无法评估的东西时,忘记它默认为内存中,除非用户说不。当前的 GAE SDK(1.7.3?)有 v2.1.x 的 JDO 插件 - 升级 SDK 可能吗?
  • 好的,我会尝试升级。会让你知道进展。但你不认为这是一个错误。请查看我编辑的问题
  • 我已经升级了,但是还是报错。我使用的版本是 GAE 1.7.3、JDO api 3.0.1、datanucleus 3.1.1
  • 解决了这个问题:),问题出在我有“scoredDate”的实体中,我正在尝试按“createdDate”排序。男生问题:)。但是 GAE 仍然没有给出适当的例外。非常糟糕
【解决方案2】:

解决了这个问题 :),问题出在我有“scoredDate”的实体中,我正在尝试按“createdDate”排序。男生问题:)。但是 GAE 仍然没有给出适当的例外。很糟糕

【讨论】:

  • 很容易抱怨错误消息没有告诉你做错了什么,但是用户可以做错的事情太多了,而且检测所有的事情通常是不切实际的.显然,您可以轻松地生成一个测试用例来演示这种情况并在 Google 的问题跟踪器上提出问题 code.google.com/p/datanucleus-appengine
  • 是的,作为程序员,我明白这一点。
猜你喜欢
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
相关资源
最近更新 更多