有没有办法在 django 中为 db 事务或通过 django 的 ORM 执行的 db 查询设置超时?
一个示例用例:
Heroku 将 django Web 请求限制为 30 秒,之后 Heroku 终止请求,不允许 django 优雅地回滚任何尚未返回的事务。这可能会使未完成的事务在 postgres 等数据库上处于打开状态。您可以在数据库中配置超时,但这也会限制与 Web 无关的查询,例如维护脚本分析等。在这种情况下,最好通过 django(或通过中间件)设置超时。
有没有办法在 django 中为 db 事务或通过 django 的 ORM 执行的 db 查询设置超时?
一个示例用例:
Heroku 将 django Web 请求限制为 30 秒,之后 Heroku 终止请求,不允许 django 优雅地回滚任何尚未返回的事务。这可能会使未完成的事务在 postgres 等数据库上处于打开状态。您可以在数据库中配置超时,但这也会限制与 Web 无关的查询,例如维护脚本分析等。在这种情况下,最好通过 django(或通过中间件)设置超时。
是的,这是可能的。
对于 postgres 客户端,有一个名为statement_timeout
. 好东西:可以通过环境变量设置。
这意味着如果您在此应用程序的 heroku 设置PGOPTIONS
中--statement-timeout=28s
设置为,则该语句将在 28 秒后失败。
请记住:此设置将用于所有测功机类型,而不仅仅是您的网络服务器。
如果要解决此问题,可以将配置添加到您的Procfile
(使用 python 示例):
web: PGOPTIONS=--statement-timeout=28s waitress-serve myapp.wsgi:application
worker: PGOPTIONS= worker.py
然后只有来自您的网络服务器的连接才会有此语句超时。