我在Google Cloud Platform上部署了Python应用程序。后台有一个Google Cloud Datastore,有两种。我使用NDB将数据拉入应用程序。
class AttEvent(ndb.Model):
event = ndb.StringProperty()
matchdate = ndb.DateTimeProperty()
class MainPage(webapp2.RequestHandler):
def get(self):
query = AttEvent.query().order(AttEvent.matchdate)
for q in query.fetch():
try:
# application code
其中一种(上面的代码中的AtEvent)给我带来麻烦。该应用程序将按预期的部署时间和工作时间/天,但会间歇性地停止返回数据。调试显示q对象是AttEvent类型的合法对象,但对于 values 集合中的每个项目,它都表示“(对象没有字段)”。当应用程序代码尝试引用模型的属性(即q.event)时,它将失败。
即使我不采取任何措施,查询也会突然在几分钟/小时后再次开始工作。我看不到任何模式或明显原因。显然,从用户角度来看这不是理想的选择。
引起麻烦的种类是静态数据,实际上仅包含3个实体。另一种是事务性的,包含数千条记录,但从未表现出相同的行为。
故障的间歇性使我相信这与缓存有关,但是我对Python和GCP还是陌生的,所以我不确定。我已经尝试在查询之前执行context.clear_cache(),但是没有效果。
我缺少明显的东西吗?
答案 0 :(得分:2)
我不知道为什么会这样,但是我可以解决。由于数据是静态的,并且实体看起来很小,因此您可以将它们存储在实例内存中,而不是每次需要时都对其进行查询。
将实体存储在模块级变量中,如下所示:
att_entities = AttEvent.query().order(AttEvent.matchdate).fetch()
class AttEvent(ndb.Model):
event = ndb.StringProperty()
matchdate = ndb.DateTimeProperty()
class MainPage(webapp2.RequestHandler):
def get(self):
for q in att_entities:
try:
# application code
只有在启动新实例时,您才可以获取实体,只要它在您第一次设置时就可以工作。另外,由于您不需要从数据存储中检索数据,因此它可以使get
调用更快。
您可能需要添加额外的逻辑以使att_entities
根据需要进行更新。