django-mysql的連接池


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM