我在GAE上部署了一个具有端点的应用程序。每个端点与数据库建立连接,获取数据并关闭连接并返回数据。通常一切正常,但是当请求加息时,它开始花费超过60秒并且请求被中止。由于这个原因,它没有关闭数据库连接,并且mysql有1000多个连接,然后每个请求开始中止,并显示截止日期超出错误。对此有什么解决方案吗?
答案 0 :(得分:2)
你可以包装"获取数据"带有try... finally...
语句的部分并移动"关闭连接" finally
部分中的部分。然后开始#34;即将超过截止日期"定时器之前"获取数据" (比如45秒)并在计时器到期时引发异常,允许您关闭finally
部分中的连接,该部分应该处理孤立的打开连接(但不会阻止这些请求中的错误)
如果您的应用程序容忍它,您还可以考虑使用具有10分钟截止时间的任务队列,这有助于减少/消除请求中的错误。
您还可以在此处找到一些有关解决超出截止日期错误的一般建议:https://cloud.google.com/appengine/articles/deadlineexceedederrors,如果适用于您的应用,则不知道。
编辑:实际上上面第一段中的建议并不适用于GAE,因为Python沙箱不允许安装自定义信号处理程序:
signal.signal(signal.SIGALRM, timer_expired)
AttributeError: 'module' object has no attribute 'signal'
在看到您的代码之后,以某种方式等效的解决方案是将cursor.fetchall()
替换为cursor.fetchone()
或cursor.fetchmany()
的循环,以便将您的操作拆分为较小的部分:
http://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-fetchone.html。输入请求处理程序时,您将获得一个开始时间戳(例如time.time()
)。然后在循环内部,您将获得另一个时间戳来测量自开始时间戳以来到目前为止所经过的时间,并且当截止时间到期时,您将退出循环并关闭数据库连接。同样,如果需要花费大量时间来准备回复,这对于成功回复请求不会有帮助。
答案 1 :(得分:0)
答案 2 :(得分:0)
考虑应用程序的设计 -
1.使用截止日期异常处理 - 设计气味
因为存在db操作需要超过60秒的情况,如果它是一个简单的查询那么它很好,但重新考虑应用程序的设计。 用户体验会受到伤害。
2.让我们改变设计以使用端点 -
https://cloud.google.com/appengine/docs/java/endpoints/
The way to go ,future proof.
3.如本文所述,使用后端或任务队列
答案 3 :(得分:-1)
您可以设置超时 interactive_timeout 和/或 WAIT_TIMEOUT 基于连接类型,他们使用其中一个