django中mysql连接池,Django db使用MySQL连接池

Django db使用MySQL连接池

Sep 25 2016

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值