将新实体发布到数据存储区后,我将页面重定向到一个新URL,该URL列出该组中的所有实体.当我重定向时,页面显示过时的结果,我必须重新加载以查看数据存储区中的新实体列表.
我知道最终的一致性.这就是为什么我看到陈旧的结果?
例如,
我的数据存储区我有一个用户 - 用户1然后,在一个表单中,我添加一个用户 - 用户2这个实体被放到数据存储区然后我重定向到一个新的网址,即'get/users'
在重定向上我只看到用户1,但如果我刷新页面,我会看到用户2.我能保证或帮助防止陈旧结果吗?
google-app-engine browser-cache app-engine-ndb google-cloud-datastore
我正在使用事务在Firestore中实现post喜欢和评论功能.我使用事务是因为我需要在帖子中的likes/comments子集和更新计数器中添加新字段,并且还将post id添加到用户喜欢/评论的帖子集合中.
我注意到如果我离线了,我就像这样请求我的帖子一切正常:
val postDocRef = FirebaseUtil.postsColRef.document(postId)
postDocRef.get().addOnSuccessListener { doc ->
val post = doc.toObject(Post::class.java)
Timber.e(post.toString())
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我在事务中执行相同的异常抛出:
val postDocRef = FirebaseUtil.postsColRef.document(postId)
FirebaseUtil.firestore.runTransaction(Transaction.Function<Void> { transaction ->
val post = transaction.get(postDocRef).toObject(Post::class.java)
}
Run Code Online (Sandbox Code Playgroud)
例外情况是:
com.google.firebase.firestore.FirebaseFirestoreException:UNAVAILABLE
为什么离线模式在交易中不起作用?是否可以在离线状态下实现此功能(在子集合中添加条目并在不同对象中更新字段)?
用continueWithTask()调用链替换事务有什么缺点?
在我的演示中,我想避免使用传统的DB并将所有数据存储在客户端,例如通过表单提交的信息.
我有什么替代方案.我听说过Gears,但我没有任何实际经验.
我还可以存储除字符串之外的二进制信息,例如图像吗?
当双缓冲由于在线程之间共享的数据时,我使用了一个系统,其中一个线程从一个缓冲区读取,一个线程从另一个缓冲区读取并从第一个缓冲区读取.麻烦的是,我将如何实现指针交换?我需要使用关键部分吗?没有可用的互锁功能实际交换值.我不能从缓冲区1读取一个线程,然后从缓冲区2开始读取,在读取过程中,这将是appcrash,即使其他线程没有开始写入它.
我在Visual Studio Ultimate 2010 RC中使用Windows上的本机C++.
我有一个数据存储,其中包含大约150,000个实体.当我使用过滤器查询商店时,我的查询真的很慢.我的结构是完全平坦的,即每个实体都是彼此的兄弟.
1:使用GQL代替过滤器更好吗?
2:这不是Data Store的最佳用例,我应该使用SQL数据库吗?
这是我的代码示例:
// Look for a buy opportunity
dateFilter = new FilterPredicate("date", FilterOperator.EQUAL, dt);
scoreFilter = new FilterPredicate("score", FilterOperator.LESS_THAN_OR_EQUAL, 10.0);
safetyFilter = new FilterPredicate("score", FilterOperator.GREATER_THAN_OR_EQUAL, -1.0);
mainFilter = CompositeFilterOperator.and(dateFilter,scoreFilter,safetyFilter);
q = new Query("StockEntity",stockKey).setFilter(mainFilter);
q.addSort("score", Query.SortDirection.ASCENDING);
stocks = datastore.prepare(q).asList(FetchOptions.Builder.withLimit(availableSlots));
Run Code Online (Sandbox Code Playgroud)
更多细节:
150,000个记录,分为500个股票,每个股票约300个记录,日期范围内每天一个.
如上所述查询,其中传递了特定日期,并且基于"得分"有效地过滤了500个股票,期望返回的记录数量在10到20之间需要超过30秒才能完成,在我的开发机器.
还没有尝试推动生产,但我想我会尝试下一步 - 我认为不会有巨大的差异.我的开发机器是一个相当高的规格iMac.
我有一个GAE数据存储表,其中包含一个数组字段(包含几个字符串).我想基于包含特定字符串的所有数组字段来过滤此表.我怎样才能做到这一点 ?我没有在GQL中看到'包含'运算符,而'in'运算符则以相反的方式运行.我只需要遍历所有实体并自己进行检查吗?
(PS我在GAE工作中使用Python).
当我们将文件上传到Google App Engine上的Blobstore时,我们发现每次上传_BlobInfo_都会创建一个类型的实体,可以在数据存储区查看器下的本地开发控制台中看到http://localhost:8888/_ah/admin,但是在将应用程序部署到App Engine之后,不会创建这样的实体当我们将文件上传到Blobstore时.它看起来很奇怪,想知道我在这里是否遗漏了什么.
我最近推出了使用AppEngine后端运行的iPhone/Android应用程序.这是我在生产中使用AppEngine的第一次经历.
随着流量的增加,我开始遇到严重的延迟问题.目前最小空闲实例为1,max_pending_latency为1s.
是的,我方面有优化的空间,但我不明白
为什么延迟与请求/秒,流量,memoryUsage,memcacheUsage,任何事情都没有关联.我不明白为什么9月21日没有明显的延迟.
为什么对memcached的调用需要慢到500ms.(通常它快10倍).我正在使用NDB和1GB专用的memcached.增加到5GB没有效果.
这简直就是AppEngine的工作原理吗?我想得到你的见解.
谢谢
App Engine(突然间)告诉我,我的Objectify设置不正确.据工作之前,我做在我的web.xml中的客体筛选.
这是我日志中的完整堆栈跟踪:
javax.servlet.ServletContext log: unavailable
java.lang.IllegalStateException: You have not started an Objectify context.
You are probably missing the ObjectifyFilter.
If you are not running in the context of an http request, see the ObjectifyService.run() method.
at com.googlecode.objectify.ObjectifyService.ofy(ObjectifyService.java:44)
at com.mydomain.gae.defaultmodule.MyObject.loadEverything(MyObject.java:21)
at com.mydomain.gae.defaultmodule.MyServlet.init(MyServlet.java:40)
at javax.servlet.GenericServlet.init(GenericServlet.java:212)
at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:440)
at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:263)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:206)
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:179)
at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:136)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:469)
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:437)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:444)
at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:256)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:308) …Run Code Online (Sandbox Code Playgroud) 假设有两个文件
/orgs/foo
/users/alice
Run Code Online (Sandbox Code Playgroud)
和/users/alice具有基准型场org其引用/orgs/foo.
/orgs/foo应该是可以访问的request.auth.uid == 'alice'.我怎样才能做到这一点?
我想这是这样的,但我无法弄明白.换句话说,我如何获取引用文档的ID?
function isOrgMember(orgId) {
return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.org.__id__ == orgId;
}
match /orgs/{orgId} {
allow read: isOrgMember(orgId);
}
Run Code Online (Sandbox Code Playgroud) java ×3
firebase ×2
android ×1
blobstore ×1
c++ ×1
flash ×1
google-gears ×1
gql ×1
gqlquery ×1
javascript ×1
latency ×1
memcached ×1
objectify ×1
performance ×1