用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解析JSON数据的基本方法
Oct 15 Python
使用Python读写文本文件及编写简单的文本编辑器
Mar 11 Python
Python正则抓取新闻标题和链接的方法示例
Apr 24 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
Jun 16 Python
python range()函数取反序遍历sequence的方法
Jun 25 Python
利用Django-environ如何区分不同环境
Aug 26 Python
celery4+django2定时任务的实现代码
Dec 23 Python
浅谈图像处理中掩膜(mask)的意义
Feb 19 Python
Pythonic版二分查找实现过程原理解析
Aug 11 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
Nov 27 Python
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
Jun 07 Python
python中super()函数的理解与基本使用
Aug 30 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递归列出所有文件和目录的代码
2008/09/10 PHP
PHP简单实现二维数组的矩阵转置操作示例
2017/11/24 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
2020/01/26 PHP
PHP7新特性
2021/03/09 PHP
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
js鼠标滑过弹出层的定位IE6bug解决办法
2012/12/26 Javascript
对比分析json及XML
2014/11/28 Javascript
jquery实现简单的表单验证
2015/11/17 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
2017/03/21 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
Express结合Webpack的全栈自动刷新
2019/05/23 Javascript
[03:11]TI9战队档案 - Alliance
2019/08/20 DOTA
[01:08:56]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第一场 2月7日
2021/03/11 DOTA
[06:07]DOTA2-DPC中国联赛3月5日Recap集锦
2021/03/11 DOTA
利用Python+阿里云实现DDNS动态域名解析的方法
2019/04/01 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
Python接口自动化判断元素原理解析
2020/02/24 Python
appium+python adb常用命令分享
2020/03/06 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
J2EE是技术还是平台还是框架
2016/08/14 面试题
新入职员工的自我介绍演讲稿
2014/01/02 职场文书
食品安全检查制度
2014/02/03 职场文书
绿化工程实施方案
2014/03/17 职场文书
电大奖学金获奖感言
2014/08/14 职场文书
三方股份合作协议书
2014/10/13 职场文书
2014年招商工作总结
2014/11/22 职场文书
行政处罚听证告知书
2015/07/01 职场文书
董事长致辞
2015/07/29 职场文书
巧用 -webkit-box-reflect 倒影实现各类动效(小结)
2021/04/22 HTML / CSS
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python