Django-PostgreSQL-每个页面都建立新连接

时间:2018-08-10 11:37:47

标签: django postgresql connection-pooling

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'tutorial',
        'USER': 'postgres',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '5432',
        'CONN_MAX_AGE': 10,
    }
}

当我导航到网站中的链接时,将创建一个新的连接。例如,输入<domain.com>后,将创建一个新连接:

2018-08-10 06:22:15.301 CDT [3380] LOG:  connection received: host=::1 port=56368
2018-08-10 06:22:15.306 CDT [3380] LOG:  connection authorized: user=postgres database=tutorial

然后导航到其中一个链接(例如<domain.com/some_page/>)后,将创建另一个新连接。

2018-08-10 06:20:10.095 CDT [22932] LOG:  connection received: host=::1 port=56181
2018-08-10 06:20:10.098 CDT [22932] LOG:  connection authorized: user=postgres database=tutorial

当我访问了域中的10个不同的链接并访问了第11个链接时,它最终达到了最大的可用连接,并断开了我通过访问<domain.com>建立的第一个连接:

2018-08-10 06:30:17.715 CDT [6884] LOG:  disconnection: session time: 0:00:09.011 user=postgres database=tutorial host=::1 port=56368

请注意,port=56368与我第一次访问<domain.com>时打开的端口完全相同。显然,每次我访问新链接时都会建立一个新连接,并且如果当前连接数超过了最大连接数,则将断开第一个连接以接受新连接。

但这不是我想要的。我不希望每次用户访问我的域内的链接时都创建新的连接。我想在每个用户的整个域中仅使用一个连接。如果用户打开一个新选项卡,那么我可能想建立一个新的连接,但是不确定这是否是正确的方法。

我该如何实现?理想情况下,我想使用连接池,但是我真的不知道如何在Django中实现它。我知道如何使用纯psycopg2建立连接池系统,但不确定是否要那样做,因为Django可能支持这种功能。还是应该为连接池编写单独的psycopg2代码?

修改

我知道CONN_MAX_AGE指定了请求可以存在的秒数。但是,我用来加载页面的连接在加载10秒后没有关闭。但是,相反,它的行为好像CONN_MAX_AGE设置了最大连接数,我不知道为什么。仅当连接数超过disconnection:时,日志文件才会输出CONN_MAX_AGE消息。加载页面10秒后,它不会输出disconnection消息。

我正在使用Django 2.0.6psycopg2 2.7.5postgreSQL 10

1 个答案:

答案 0 :(得分:0)

“ CONN_MAX_AGE”是您的连接保持活动的秒数。尝试从数据库设置中删除该参数。

Django本质上不支持连接池。您可以尝试从池中建立连接并关闭连接。但这不是实际的连接池。