【问题标题】:write too frequent ,datastore contention timeout写入太频繁,数据存储争用超时
【发布时间】:2010-02-09 01:15:54
【问题描述】:

我阅读了应用引擎 wiki,如果写得太频繁,数据存储争用 1秒内超过5次。 wiki 介绍了使用“shard” 方法”作为解决方法。我可以知道我们是否使用 spring @transactional 在这一点上,这可以防止数据存储争用超时,因为 同时写入完成?

【问题讨论】:

    标签: java spring google-app-engine google-cloud-datastore


    【解决方案1】:

    不,你不能那样做。无论您是否使用@transactional,它都不会解决问题——事实上您有一个对象需要继续写入。无论您使用什么方法,争用限制都将继续保持不变。

    这个问题的答案实际上是决定你想要做什么,以及准确性对你来说有多重要。以一个简单的计数器为例,这是这个问题的一个常见例子。如果您认为准确性非常重要,那么您将必须有一个计数器列表,您可以按顺序或随机选择并写入。如果您在此列表中有 10 个计数器,那么这会为您提供每秒更多次的写入,甚至是事务性写入。不过,您需要编写代码来选择要写入的计数器。

    另一方面,如果您不需要太高的精度,您可以尝试经常写入内存缓存。写入内存缓存或增加计数器时,写入争用限制要高得多。然后,您可以按设定的时间间隔写出并重置计数器。

    【讨论】:

    • 这里有详细的文章介绍如何实现:code.google.com/appengine/articles/sharding_counters.html
    • 是的,我理解你的解释。但可以说我“不需要快速写入”。将进行@transactional+sequential writing 以防止发生争用超时,方法是缓慢地进行“一次一个”的顺序写入
    • 假设我需要对 db 进行 6 次写入,并且我知道 db 每秒最多可以写入 5 次。剩下的 1 (6-5) 次是否会在 1 秒后正确写入
    • 我不相信@transactional 会帮助你 - 写入将被重试一定次数,之后将引发异常。不过,这种方法根本无法扩展……剩余的写入量只会不断增加。
    【解决方案2】:

    当我从事一个需要将大量单独记录存储到数据库的项目时,我发现系统无法处理所有并发事务。我改为在内存中构建对象,然后立即将其保存到数据库中。

    【讨论】:

      猜你喜欢
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多