http://pypi.python.org/pypi/django-mysqlpool/0.1-7一个 SmartFile 的开源项目

介绍

这是一个简单的mysql连接池的数据库后端。这个后端实现源于Ed Menendez的一个博客文章:
http://menendez.com/blog/mysql-connection-pooling-django-and-sqlalchemy/和博客有两个不同:
1.工作已经替你完成。
2.我们不是复制出django的mysql后端,我们只是monkey-patch(不修改源码的基础上扩展)它。

第二种看起来不好,但是它不依赖指定的版本中,用这个方法让我们将受益django的bug修改,这只是一个连接池层(一个单独进程)。

这个pooling使用SQLAlchemy。它不完美但非常有用(这个后端是一个单独的进程)它主要解决的问题是为一个进程提供限定的连接。

用法

用下面的配置取代默认的后端配置。

DATABASES = {
    'default': {
        'ENGINE': 'django_mysqlpool.backends.mysqlpool',
        'NAME': 'db_name',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': '',
        'PORT': '',
    },
}

配置

你可以定义池的执行和特定的参数。参数的定义自己看SQLAlchemy的文档

        MYSQLPOOL_BACKEND - pool 实现的名字 (默认'QueuePool').
        MYSQLPOOL_ARGUMENTS - 给 pool传递的参数

这个例子,使用不适用本地线程的QueuePool ,你可以使用下面的配置:

MYSQLPOOL_BACKEND = 'QueuePool'
MYSQLPOOL_ARGUMENTS = {
    'use_threadlocal': False,
}

关闭连接

这里和直接关闭连接池不会直接操作。在你开始连接池后,关闭就显得很重要了。

当你处理一个线程应用的时候就产生了依赖。就像一台服务器,它创建和你多线程处理当前操作。每个线程都保持数据库连接,一旦我们开始连接池,这个服务器会很快的用尽连接池数目限制。

这个看起来是一个失败,但是它很成功。我们实现指定每个进程一个确切的连接数量。这个防止任何进程影响别的服务,将全局问题限制到本地问题。当我们发现有一个服务滥用mysql服务,我们就要修复它。

这个线程服务器的问题详细描述如下:
http://stackoverflow.com/questions/1303654/threaded-django-task-doesnt-automatically-handle-transactions-or-db-connections
因此,这个库提供了一个帮助管理的形式:

from django_mysqlpool import auto_close_db

@auto_close_db
def function_that_uses_db():
    MyModel.objects.all().delete()

   
对于pooling,关闭连接及早和多次是一个好性能的关键,关闭的连接是可重用的。这样连接总数会下降。我们一般在QueuePool模式下需要use_threadlocal 。让线程共享相同的连接。一旦我们共享连接,服务使用比线程数少的连接。