原文: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
希望這些能幫助你快些理解連接緩存。