Django db使用MySQL鏈接池

Django db使用MySQL鏈接池

Django db模塊自己不支持MySQL鏈接池,只有一個配置CONN_MAX_AGE鏈接最大存活時間,若是WSGI服務器使用了線程池技術,會達到鏈接複用的效果。可是若是WSGI服務若是是每一個請求都建立新的線程,那麼這個配置沒有任何效果,由於鏈接保存在Thread.local()名稱空間中,在不一樣的線程中不能複用。python

在上一篇greentor MySQL鏈接池實現中已經實現了MySQL鏈接池,只須要重寫Django MySQL backend以支持鏈接池,就能達到鏈接複用的目的,減小socket 3次握手的開銷,提升性能。mysql

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

 

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)

  

修改數據庫配置引擎github

 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了一點點,哈哈。sql

相關文章
相關標籤/搜索