django-mysql的連接池的實現文章


原文:http://menendez.com/blog/mysql-connection-pooling-django-and-sqlalchemy/

這是一個很快速和浪費的使用SQLAlchemy來獲得連接緩存。它不是一個真正的連接池,它需要一個獨立進程來處理連接。這個在你完成查詢后關閉連接,我們誒有替換django的ORM。

在自帶的集中后端中,通常,在使用django來獲取數據庫,django會會在線程完成的時候關閉連接。所以,如果你做:

q = Model.objects.all() 


在你銷毀"q",他會關閉數據庫連接。這不是一個好方法,它每次都要連接數據庫和釋放數據庫連接。要避免這個,你可以使用SQLAlchemy來緩存這些連接。使用SQLAlchemy,當"q"銷毀的時候數據庫連接沒有關閉。數據庫連接只會在進程運行的python關閉,如果你的web服務器殺掉idle的線程,你都會有這個問題,你不能避免。可以看我之前的文章看看關於線程。

第一步-安裝SQLAlchemy
第二步-復制mysql后端
第三步-修改settings.py
第四部-覆蓋mysql_pool后端
編輯新的base.py在你的新mysql_pool目錄,加入:

try:
    from settings import DATABASE_WAIT_TIMEOUT
except ImportError:
    print u'DATABASE_WAIT_TIMEOUT not in settings.py, defaulting to 120.'
    DATABASE_WAIT_TIMEOUT = 120
import sqlalchemy.pool as pool 

接着,找到 "import MySQLdb as Database" 這一行,加入:

Database = pool.manage(Database, recycle=DATABASE_WAIT_TIMEOUT-1) # must match or be less than wait_timeout in mysql

最后,找到base.py 中的"elf.connection = Database.connect(**kwargs)",然后加入

if settings.DATABASE_HOST.startswith('/'):
    self.connection = Database.connect(port=kwargs['port'], unix_socket=kwargs['unix_socket'], user=kwargs['user'], db=kwargs['db'], passwd=kwargs['passwd'], use_unicode=kwargs['use_unicode'], charset='utf8')
else:
    self.connection = Database.connect(host=kwargs['host'], port=kwargs['port'], user=kwargs['user'], db=kwargs['db'], passwd=kwargs['passwd'], use_unicode=kwargs['use_unicode'], charset='utf8')
    

Testing:
測試,加載你的應用,監控mysql數據庫連接在 "Server Connections" 。注意刷新中pid沒有增加。你可以試着切換這兩種后端來比較不同。
在mysql里使用 show status
希望這些能幫助你快些理解連接緩存。


免責聲明!

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



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