Django db使用MySQL链接池
Sep 25 2016Django 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