处理数据库超时谷歌引擎应用程序

2024-10-03 15:27:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在测试我的应用程序(在Google App Engine实时服务器上),我编写它的方式大约有40个数据库GqlQuery()我代码中的语句(主要是类的一部分)。在

我一直在数据库超时不过,通常情况下。在

我该怎么处理?我要用这样一个非常残酷的代码包围我的所有查询:

  querySucceeded = False
  while not querySucceeded :
    try :
      result = db.GqlQuery( """xxx""" ).get()
      querySucceeded = True #only get here if above line doesn't raise exc
    except :
      querySucceeded = False

这样可以吗?你同意吗?什么是更好的处理方法数据库超时?在

编辑:

我现在用这个来做任何get查询

^{pr2}$

对于fetch和count我有类似的函数。在


Tags: 代码服务器数据库falseapp应用程序getgoogle
3条回答

这里有一个装饰师要重试数据库超时,改编自Kay框架:

import logging, time
from google.appengine.ext import db

def retry_on_timeout(retries=3, interval=1.0, exponent=2.0):
    """A decorator to retry a given function performing db operations."""
    def _decorator(func):
        def _wrapper(*args, **kwargs):
            count = 0
            while True:
                try:
                    return func(*args, **kwargs)
                except db.Timeout, e:
                    logging.debug(e)
                    if count >= retries:
                        raise e
                    else:
                        sleep_time = (exponent ** count) * interval
                        logging.warning("Retrying function %r in %d secs" %
                            (func, sleep_time))
                        time.sleep(sleep_time)
                        count += 1

        return _wrapper

    return _decorator

要使用它,只需装饰任何执行db操作的函数,并希望重试:

^{pr2}$

看看这个python自动测试数据存储超时的方法。类似于moraes-answer,但您只需要在初始化时调用一次,而不需要修饰执行数据存储操作的函数。在

{a1}

查询偶尔会失败。您可以向用户显示错误消息,也可以像上面所做的那样重试。但是,如果您重试,则应该使用线程睡眠为了增加每次重试的延迟量(从50ms开始),如果不尽快重试,重试更有可能成功。在

不过,每个请求有40个查询是一个。你应该考虑重构你的代码-必须有可能消除其中的大部分!在

相关问题 更多 >