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
希望这些能帮助你快些理解连接缓存。

posted on 2012-12-17 19:32  DON'T PANIC  阅读(3362)  评论(0编辑  收藏  举报

导航