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