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 。让线程共享相同的连接。一旦我们共享连接,服务使用比线程数少的连接。