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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM