django中使用数据库连接池

数据库连接池的概念

据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。

创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。

假设网站一天有很大的访问量,数据库服务器就需要为每次连接创建一次数据库连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的.数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

Django中使用数据库连接池的流程

安装

pip install djorm_ext_pool

配置settings

INSTALLED_APPS=[
    ...,
    djorm_pool,
    ...,
]

DJORM_POOL_OPTIONS = {
    "pool_size": 20,
    "max_overflow": 0,
    "recycle": 3600, # the default value
# 其中DATABASE_WAIT_TIMEOUT为你定义的连接超时时间,
# 必须小于等于mysql里面的wait_timeout()
}

可能出现的要修改的BUG

$virtualenv_path/Lib/site-packages/djorm_pool/__init__.py 52行附近,做出如下修改。

def patch_mysql():
    class hashabledict(dict):
        def __hash__(self):
            # return hash(tuple(sorted(self.items())))            
            return hash(frozenset(self))

版权声明:除特别注明外,本站所有文章均为王晨曦个人站点原创

转载请注明:出处来自王晨曦个人站点 » django中使用数据库连接池

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

  1. John 说道:

    兄台,问两个问题啊: 1,最后改的那个代码,如果不改会有什么问题? 2,settings中是否有必要设置DATABASE_WAIT_TIMEOUT?

  2. 王晨曦 说道:

    第一个问题:之所以修改这个地方的代码,是因为django的这个模块的版本有问题,如果不修改根本就运行不起来,直接报错。第二个问题:DATABASE_WAIT_TIMEOUT是django框架中数据库访问连接的配置参数 setting.py中DATABASES = {}中的配置项,这个参数在框架中有默认值,具体你可以参考django官方说明文档。与文中"recycle" 的配置数值必须要小于mysql数据库中wait_timeout的配置参数。如果recycle的配置参数值大于wait_timeout的参数值,会导致运行过程连接异常。同理DATABASE_WAIT_TIMEOUT的配置参数值也应该小于wait_timeout的参数值。在没有使用连接池的情况下,当数据访问需求增加,想通过多连接解决数据库访问瓶颈的时候,这个参数还是有设置必要的。因为数据库一般都会有限制最大连接数,一些使用频率不高的连接如果不及时断开数据库连接会导致其他连接连接不上数据库。具体设置与否需要你根据实际的使用场景。如果使用djorm_ext_pool来管理数据库连接的话,配置recycle参数后,DATABASE_WAIT_TIMEOUT参数可以不用配置。

  3. 王晨曦 说道:

    等有时间,我会把他整理到blog中

  4. John 说道:

    多谢多谢,很有用

  5. John 说道:

    多谢多谢,很有用