【问题标题】:Making SQL Alchemy Play Nice With Google App Engine使用 Google App Engine 让 SQL Alchemy 发挥出色
【发布时间】:2012-11-14 01:27:42
【问题描述】:

我目前正在开发一个 Google App Engine (Python) 项目,该项目主要使用 Google Cloud SQL(使用 SQL Alchemy)进行后端数据存储。

大多数时候一切都运行良好。然而,偶尔“某事”会出问题,我们开始遇到奇怪的例外情况。例如:

  • AttributeError: 'ColumnProperty' 对象没有属性 'strategy'

  • AttributeError: 'RelationshipProperty' 对象没有属性 'strategy'

我们认为这可能与新 GAE 实例的启动有关,但我们不能确定。

说了这么多,我的问题是这个。我和我的团队可以使用哪些策略来追踪此问题?

请记住,该应用程序在 Google App Engine 上运行,因此可能会稍微限制我们的选择。

更新: Owen Nelson 下面的评论是正确的。我们已按照 Google 的建议添加了 threading.RLock。然而,我们仍然会看到这个问题,但频率要低得多。

我想明确一点,到目前为止,我们无法在本地环境中重现此问题。我们很确定这与动态实例旋转有关,这不是我们在开发中真正可以做的事情。

【问题讨论】:

  • 如果有帮助,我们的应用程序将构建在 webapp2 框架之上。
  • 我们已经研究这个问题一段时间了,我们已经将其缩小到实例初始化的问题。按照 google 的 migrating to the python 2.7 runtime guide 中关于关键应用程序初始化步骤的建议(例如以严格的顺序导入 sqlalchemy 声明性模型)添加 threading.RLock()s 似乎有助于大部分时间,但我们仍然看到这些错误来自不时启动新实例。真的很气人。

标签: python google-app-engine sqlalchemy


【解决方案1】:

据我了解,您的应用程序仅在生产模式下存在问题。

尝试在开发模式下重现错误

最好的解决方案是能够在开发模式下重现该错误。为此,您可以尝试使用大量数据运行一批单元测试。 (见how to do local test on appengine)。

如果这不起作用......

开启 appstats 以获取有关处理程序的更多信息

您可以打开 appstats 以尝试获取有关当前导致问题的处理程序的信息。 Appstats 通常会为您提供有关数据存储的信息,这与我们的案例无关,但您可以从一般请求中获取信息(例如响应时间)

识别处理程序并将其包装在漂亮的 try catch 中

一旦您确定了问题的根源或引发问题的位置,您可以用 try..catch. 将其包围。这样您可以获得有关当前执行 Trace 的更多信息,并有望解决您的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2011-07-17
    • 2014-05-12
    • 1970-01-01
    相关资源
    最近更新 更多