首页 > 解决方案 > Django中的持久连接?

问题描述

我试图了解持久连接如何提高性能,尤其是当我的应用程序读取繁重时。所以,我有 100000 行的记录,并且我已经索引了用户名字段。所以,我创建了一个端点,我可以在其中使用用户名进行查询,它给了我温度。这仅用于测试目的。因此,我编写了另一个脚本,该脚本具有创建一个运行 1000 次的循环并向端点发出请求的函数。我记录了请求响应时间并将其保存在一个列表中,然后计算完成 1000 个请求所需的总时间。首先,我尝试使用没有持久连接的默认 Django 数据库设置,每次我对时间进行基准测试,它记录所有 1000 个请求的时间约为 43 秒。接下来,我添加了 CONN_MAX_AGE=60 并多次运行脚本,发现时间每次增加到103秒。现在,如果我没记错的话,持久连接应该减少了总时间,但由于某种原因,它比每次请求-响应完成时打开和关闭的正常连接要高得多。我的问题是为什么会这样?脚本.py

import requests
import random
import time
def make_request():
    username = ['00b076300079144ca0667c341aeac046','remy','surajit','remy11']
    t = []

    for i in range(1000):

        response = requests.get('http://127.0.0.1:8082/temperature/t/{}/'.format(random.choice(username)))
        t.append(response.elapsed.total_seconds())
        print(random.choice(username),response.status_code,response.elapsed.total_seconds())
    print('total time',sum(t))

make_request()

DetailView 端点

class TempratureDetailView(DetailView):
    model = Temperature
    template_name = 'temperature/t_detail.html'

    def get_object(self, queryset=None):
        return Temperature.objects.get(username=self.kwargs.get('username'))

模型.py

class Temperature(models.Model):
    username = models.TextField(db_index=True,primary_key=True)
    temperature = models.IntegerField(blank=True, null=True)

    class Meta:
        db_table = 'temperature'

持久数据库设置

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.postgresql_psycopg2',

        'NAME': '',

        'USER': '',

        'PASSWORD': '',

        'HOST': 'localhost',

        'PORT': '',

        'CONN_MAX_AGE': 600, #10 minutes

    }
}

标签: pythondjangopostgresql

解决方案


根据您在评论中的说明,您正在开发服务器上运行这些测试。
引用 Django 的文档

开发服务器为它处理的每个请求创建一个新线程,从而消除持久连接的影响。不要在开发过程中启用它们。

基本上每个线程都会启动它自己到数据库的连接,考虑到在测试中发出的请求数量以及 的设置CONN_MAX_AGE=60,很可能您的数据库不支持与服务器在这种情况下建立的连接一样多,导致更长的等待关闭以前的连接,并且还否定了持久连接的使用。鉴于得出正确结论的情况,需要在生产服务器上进行更好的测试


推荐阅读