【发布时间】:2020-02-11 15:45:29
【问题描述】:
我有一个长时间运行的任务来更新一些 SQLAlchemy 对象。在任务开始时打开一个会话,在此过程中进行更新,最后提交事务。问题是任务运行时间很长,所以连接将在提交之前关闭(超时,“消失”,无论你想怎么称呼它)。这会导致提交失败,整个任务也会失败。
这似乎绝对是向数据库写入短任务或非 Celery 相关事物的正确方法。但是如果任务时间太长,那肯定是个问题。
还有其他推荐的模式吗? Celery 任务是否应该甚至不使用 SQLAlchemy 对象,而是使用某种静态类,其数据可用于更新实际的 SQLAlchemy 对象,也许仅在任务结束时?这是我想出的唯一可能的解决方案。我想知道是否还有其他人,或者我的想法是否有其他问题。
【问题讨论】:
-
您能否更具体地了解“超时”连接?我曾经有过大量使用 sqlalchemy 的芹菜任务,之前运行了超过 24 小时,并且没有遇到任何此类问题。不过,我当然不会让交易保持那么长时间。您应该在此过程中进行少量提交,否则您的数据库锁定记录等可能会遇到更大的问题
-
@StephenFuhry 错误是“MySQL 服务器已消失”。连接断开。我相信,这正是我让交易开放时间过长的问题。但我觉得我必须这样做,因为这段时间我编辑了很多数据库对象。 Celery 任务使用 SQLAlchemy 对象。如果我不应该让交易长时间处于开放状态,我该怎么办?
-
我会首先寻找方法将工作分解成更小的块,如果可能的话,这些块不需要这么长的事务。否则,这可能是 mysql 配置问题。查看 max_allowed_packet 或其他类似设置.. stackoverflow.com/questions/7942154/…
-
绝对不是配置问题。我理解你关于打破它的观点。我想答案是仅在需要写入时才打开事务。
标签: sqlalchemy celery