我正在构建一个基于Postgres数据库构建的GeoDjango应用程序的API。我有一个相当新手的问题。
我的API是RESTful和只读 - 它只允许用户使用一些过滤器查询我的数据,并获得一些结果。
我的问题是这个。我知道有一些查询可以通过API执行,执行速度极慢(例如大面积的复杂地理查询 - 我确实希望允许用户在一小块区域内执行此操作) 。
这些查询是否有可能导致整个数据库崩溃? (我很确定我已经看到了这种情况。)如果有可能,我能做些什么呢?
我是否应该限制通过API允许的查询类型 - 例如检查输入,只在小范围内执行查询?
或者(最好,因为我很难准确地预测哪些查询会很慢)我可以在我的数据库上使用一个设置来杀死这些查询,然后再杀死整个应用程序?
答案 0 :(得分:2)
我认为Django或geodjango不会支持查杀耗时过长的查询。
快速搜索postgresql文档给了我以下内容: http://www.postgresql.org/docs/9.3/static/runtime-config-client.html#GUC-STATEMENT-TIMEOUT
statement_timeout(整数)
从命令到达服务器的时间开始,中止任何超过指定毫秒数的语句 来自客户。如果log_min_error_statement设置为ERROR或更低, 超时的声明也将被记录。值为零( 默认情况下将其关闭。
建议不要在postgresql.conf中设置statement_timeout,因为它会影响所有会话。
但这会影响所有查询,因此您可能会因某些原因而破坏需要更长时间的其他功能。
建议的方法是创建一个特殊用户,例如web_user,在运行这些查询的数据库上,并限制该用户的时间:
ALTER ROLE web_user SET statement_timeout = 10000;
答案 1 :(得分:0)
在django中,您可以在statement_timeout
中为postgresql数据库实现settings.py
(毫秒),如下所示:
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'dbname',
'USER': 'username',
'PASSWORD': '',
'HOST': '',
'PORT': '',
'OPTIONS': {
'options': '-c statement_timeout=1000'
}
},