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 。讓線程共享相同的連接。一旦我們共享連接,服務使用比線程數少的連接。