用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 相关文章推荐
python3 与python2 异常处理的区别与联系
Jun 19 Python
Python通过matplotlib画双层饼图及环形图简单示例
Dec 15 Python
Python下载网络文本数据到本地内存的四种实现方法示例
Feb 05 Python
python分治法求二维数组局部峰值方法
Apr 03 Python
python中的二维列表实例详解
Jun 19 Python
python2.7和NLTK安装详细教程
Sep 19 Python
Python Pandas 如何shuffle(打乱)数据
Jul 30 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
Pycharm中配置远程Docker运行环境的教程图解
Jun 11 Python
django 将自带的数据库sqlite3改成mysql实例
Jul 09 Python
Python读取yaml文件的详细教程
Jul 21 Python
总结Python变量的相关知识
Jun 28 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
杏林同学录(九)
2006/10/09 PHP
PHP 登录记住密码实现思路
2013/05/07 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
Yii框架用户登录session丢失问题解决方法
2017/01/07 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
javascript编程起步(第七课)
2007/01/10 Javascript
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
Javascript获取当前日期的农历日期代码
2014/10/08 Javascript
JavaScript动态插入CSS的方法
2015/12/10 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
在vue项目创建的后初始化首次使用stylus安装方法分享
2018/01/25 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
一看就会的vuex实现登录验证(附案例)
2020/01/09 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
深入浅析Python字符编码
2015/11/12 Python
Python实现八大排序算法
2016/08/13 Python
Python pymongo模块用法示例
2018/03/31 Python
python得到一个excel的全部sheet标签值方法
2018/12/10 Python
Pytorch Tensor的索引与切片例子
2019/08/18 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
canvas 如何绘制线段的实现方法
2018/07/12 HTML / CSS
美国廉价机票预订网站:Cheapfaremart
2018/04/28 全球购物
双立人美国官方商店:ZWILLING集团餐具和炊具
2020/05/07 全球购物
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
高职助产应届生自荐信
2013/09/24 职场文书
文化建设工作方案
2014/05/12 职场文书
员工工作自我评价
2014/09/26 职场文书
2015年学校食堂工作总结
2015/04/22 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书
六一活动主持词
2015/06/30 职场文书
农村房屋租赁合同(范本)
2019/07/23 职场文书
redis 限制内存使用大小的实现
2021/05/08 Redis