zoukankan      html  css  js  c++  java
  • djangomysql的连接池的实现文章

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

  • 相关阅读:
    微信小程序非域名测试环境,手机预览不正常,模拟器和真机调试正常解决办法
    vue 建项目及初步开发遇到的问题
    开发&测试
    架构&项目
    运维
    读书&源码
    ArrayList
    jdk集合知识点整理
    jdk集合关系图
    jvm知识点整理
  • 原文地址:https://www.cnblogs.com/wanself/p/2822185.html
Copyright © 2011-2022 走看看