• Django db使用MySQL连接池


    Django db使用MySQL连接池

    Django db模块本身不支持MySQL连接池,只有一个配置CONN_MAX_AGE连接最大存活时间,如果WSGI服务器使用了线程池技术,会达到连接复用的效果。但是如果WSGI服务如果是每个请求都创建新的线程,那么这个配置没有任何效果,因为连接保存在Thread.local()名称空间中,在不同的线程中不能复用。

    在上一篇greentor MySQL连接池实现中已经实现了MySQL连接池,只需要重写Django MySQL backend以支持连接池,就能达到连接复用的目的,减少socket 3次握手的开销,提高性能。

    https://github.com/zhu327/greentor/blob/master/demo/core/base.py

    from django.db.backends.mysql.base import (SafeText, SafeBytes, six,
        DatabaseWrapper as BaseDatabaseWrapper)
    from greentor.mysql import ConnectionPool
    
    class DatabaseWrapper(BaseDatabaseWrapper):
        u"""
        支持greentor mysql connection pool 的backends
        """
        pools = {} # 类变量用于保存所有不同数据库的连接
    
        def get_new_connection(self, conn_params):
            # conn = Database.connect(**conn_params)
            if not self.alias in self.pools: # 如果需要的数据库还没有连接池则新建连接池
                self.pools[self.alias] = ConnectionPool(mysql_params=conn_params)
            conn = self.pools[self.alias].get_conn() # 获取新的连接时从连接池中获取
            conn.encoders[SafeText] = conn.encoders[six.text_type]
            conn.encoders[SafeBytes] = conn.encoders[bytes]
            return conn
    
        def _close(self):
            if self.connection is not None: # 不再直接关闭连接,而是释放连接到连接池中
                self.pools[self.alias].release(self.connection)
    

      

    修改数据库配置引擎

     1 DATABASES = {
     2     'default': {
     3         'NAME': 'test',
     4         'HOST': '127.0.0.1',
     5         # 'ENGINE': 'django.db.backends.mysql',
     6         'ENGINE': 'core',
     7         'USER': 'root',
     8         'PASSWORD': '',
     9     }
    10 }

    连接池backend的代码虽然很少,但是在尝试过程中,基本把Django db模块的代码都过了一遍,感觉自己又牛B了一点点,哈哈。

  • 相关阅读:
    vuex 命名空间
    vue-touchjs
    Jackson最简单用法
    Bootstrap登录样式
    Left/Right/Inner Join用法和区别
    VS2015安装提示出现“安装包丢失或损坏”解决方法
    HTML之禁止输入文本
    jQuery之call()方法的使用
    jQuery操作cookie
    jQuery常用的查找Dom元素方法
  • 原文地址:https://www.cnblogs.com/rangger/p/9801596.html
Copyright © 2020-2023  润新知