Django:如何保存数据库连接

时间:2017-02-21 15:47:06

标签: python django postgresql

我有一个PostgreSQL数据库,其中包含近2000行的表。客户端加载前75行,当用户向下滚动时,客户端加载另外75行。我的任务是优化其他数据的加载。

实际检索数据有三个查询。其中两个每个需要50毫秒,另一个需要150毫秒,总计250毫秒,而Python代码执行的实际时间是600毫秒。我测量了每个查询的执行情况,然后打印了查询。我注意到第一个查询需要额外的350毫秒来执行,但connection.queries表示查询花了50毫秒。

我删除了第一个查询(用虚拟替换它)并注意到现在时间是550毫秒,第二个查询需要额外的350毫秒。我添加了第一个查询并用原始SQL替换它:

        cursor = connection.cursor()
        t_count_query = time.time()
        cursor.execute('...')
        result = cursor.fetchone()[0] # the result of this query is a single value

而不是一行我现在有connection.cursor()然后是实际的查询。我决定用这段代码单独计时:

    t_connecting = time.time()
    cursor = connection.cursor()
    t_connecting = time.time() - t_connecting
    print 'Connection time: {0}'.format(t_connecting)

    t_count_query = time.time()
    cursor.execute('...')
    result = cursor.fetchone()[0]
    t_count_query = time.time() - t_count_query
    print 'Count query: {0}'.format(t_count_query)

输出:

Connection time: 0.367555141449
Count query: 0.0511040687561

正如您所见,connection.cursor()大约需要350毫秒,查询大约需要50毫秒。这也解释了为什么第二个查询在第一个查询不存在时需要350毫秒。 Django查询(我的意思是像MyModel.objects.all())也必须连接到数据库,在我的情况下需要大约350ms。

因此,每当用户在客户端上结束时,服务器必须打开新连接并浪费350毫秒。当用户按下“下一步”时,它就可以了。按钮以获取另一页数据。在这种情况下,350毫秒几乎没有任何区别。但是当客户端是一个长的可滚动页面时,每次用户点击结束时等待都会产生恼人的用户体验。

因此,我的问题是,我可以以某种方式在指定的时间内保存与数据库的连接,例如10分钟,以使客户端的滚动更顺畅吗?

修改

我用谷歌搜索了django持续连接'我发现CONN_MAX_AGE并将其设置为300.有趣的是,现在50ms查询大约需要100ms。测量它给了我740ms!并且要求不超过SECOND!一段时间(约5分钟)后,时间达到正常600毫秒。

因此,现在我有另一个问题。持久连接如何比默认CONN_MAX_AGE=0慢?是否有其他方法来建立持久连接,我应该使用它而不是设置CONN_MAX_AGE

0 个答案:

没有答案