Django db使用MySQL连接池
Django db使用MySQL连接池
Sep 25 2016Django 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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了一点点,哈哈。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗