用sqlalchemy构建Django连接池的实例


Posted in Python onAugust 29, 2019

都知道django每次请求都会连接数据库和释放数据库连接。Django为每个请求使用新的数据库连接。一开始这个方法行得通。然而随着服务器上的负载的增加,创建/销毁连接数据库开始花大量的时间。要避免这个,你可以使用数据库连接池,这里使用SQLAlchemy的连接池。使Django持久化数据库连接。

但这种方法会改变django的代码。对框架有侵入

方法 1

实现方法如下:

把django/db/backends/mysql文件夹全部拷贝出来,放在项目的一个libs/mysql下面,然后修改base.py文件。

或者把django/db/backends/mysql文件夹在django/db/backends/下面复制为mysql_pool文件夹,将base.py中所以import中的mysql替换为mysql_pool,这样可以直接在settings.py中设置'ENGINE':'django.db.backends.mysql_pool'

找到

try: 
 import MySQLdb as Database
except ImportError as e: 
 from django.core.exceptions import ImproperlyConfigured 
 raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e)

这段代码,在下面添加:

from sqlalchemy import pool
Database = pool.manage(Database[,recycle=DATABASE_WAIT_TIMEOUT-1])
#其中DATABASE_WAIT_TIMEOUT为你定义的连接超时时间,必须小于等于mysql里面的wait_timeout()

结果如下

try: 
 import MySQLdb as Database
except ImportError as e: 
 from django.core.exceptions import ImproperlyConfigured 
 raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e)
from sqlalchemy import pool
Database = pool.manage(Database)

然后找到get_connection_params(self)函数代码:

def get_connection_params(self):
 kwargs = {
  'conv':django_conversions,
  'charset':utf8
  }
  ...

修改为:

def get_connection_params(self):
 kwargs = {
  'charset':utf8
  }
  ...

注意:如果不改变此处的kwargs,将会出现:TypeError:unhashable type:'dict' 的错误。

原样用kwargs传的话,sqlalchemy的pool会报unhashable错误,那是因为kwargs中有个key(conv)对应的value(django_conversions)是个字典,在pool中会把(key,value)组成元组作为新的key保存在pool中,但是因为value(django_conversions)是dict,不允许作为key的

在mysql里使用 show status 或 show processlist查看连接情况

方法 2

直接在settings.py同级目录下的init.py文件中添加如下代码

from django.conf import settings
from django.db.utils import load_backend
import sqlalchemy.pool as pool
import logging
pool_initialized=False

def init_pool():
  if not globals().get('pool_initialized', False):
   global pool_initialized
   pool_initialized = True
   try:
    backendname = settings.DATABASES['default']['ENGINE']
    backend = load_backend(backendname)

    #replace the database object with a proxy.
    backend.Database = pool.manage(backend.Database)

    backend.DatabaseError = backend.Database.DatabaseError
    backend.IntegrityError = backend.Database.IntegrityError
    logging.info("Connection Pool initialized")
   except:
    logging.exception("Connection Pool initialization error")

init_pool()

然后修改django/db/backends/mysql/base.py文件

找到get_connection_params(self)函数代码:

修改为:

def get_connection_params(self):
 kwargs = {
  'charset':utf8
  }
  ...

同理,不修改kwargs将会出现:TypeError:unhashable type:'dict' 的错误。

以上两种方法都要改变django的代码,有一定入侵性,第二种方法改变要小一点

django 1.7
python 2.7
sqlalchemy 1.0

这篇用sqlalchemy构建Django连接池的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python、Javascript中的闭包比较
Feb 04 Python
详解在Python程序中使用Cookie的教程
Apr 30 Python
python字符串连接方法分析
Apr 12 Python
python async with和async for的使用
Jun 20 Python
浅谈django2.0 ForeignKey参数的变化
Aug 06 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
Aug 22 Python
Python pandas自定义函数的使用方法示例
Nov 20 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
Feb 23 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
May 22 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
Feb 01 Python
python中的被动信息搜集
Apr 29 Python
详解Python 字符串相似性的几种度量方法
Aug 29 #Python
python多线程同步之文件读写控制
Feb 25 #Python
python线程中的同步问题及解决方法
Aug 29 #Python
python实现H2O中的随机森林算法介绍及其项目实战
Aug 29 #Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
Aug 29 #Python
深入了解python中元类的相关知识
Aug 29 #Python
Django shell调试models输出的SQL语句方法
Aug 29 #Python
You might like
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
2015/12/24 PHP
js同时按下两个方向键
2007/12/01 Javascript
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
Javascript base64编码实现代码
2011/12/02 Javascript
jQuery filter函数使用方法
2014/05/19 Javascript
jquery实现Ctrl+Enter提交表单的方法
2015/07/21 Javascript
微信小程序 wxapp视图容器 view详解
2016/10/31 Javascript
JavaScript原生编写《飞机大战坦克》游戏完整实例
2017/01/04 Javascript
利用Angular.js编写公共提示模块的方法教程
2017/05/28 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
微信小程序promsie.all和promise顺序执行
2017/10/27 Javascript
axios拦截设置和错误处理方法
2018/03/05 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
记录一篇关于redux-saga的基本使用过程
2018/08/18 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
2018/10/31 Javascript
JS与SQL方式随机生成高强度密码示例
2018/12/29 Javascript
用node.js写一个jenkins发版脚本
2019/05/21 Javascript
vue+moment实现倒计时效果
2019/08/26 Javascript
微信小程序实现下滑到底部自动翻页功能
2020/03/07 Javascript
在Webpack中用url-loader处理图片和字体的问题
2020/04/28 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
python 的列表遍历删除实现代码
2020/04/12 Python
Python 获取当前所在目录的方法详解
2017/08/02 Python
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
使用html5制作loading图的示例
2014/04/14 HTML / CSS
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
迪奥美国官网:Dior美国
2019/12/07 全球购物
俄罗斯隐形眼镜和眼镜在线商店:Cronos
2020/06/02 全球购物
ddl,dml和dcl的含义
2016/05/08 面试题
正隆泰信息技术有限公司上机题
2012/06/14 面试题
保安的辞职报告怎么写
2014/01/20 职场文书
python中pycryto实现数据加密
2022/04/29 Python