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

转载于:https://www.cnblogs.com/wanself/archive/2012/12/17/2822185.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值