用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创建和删除目录的方法
Apr 29 Python
python使用xlrd模块读写Excel文件的方法
May 06 Python
Python深入06——python的内存管理详解
Dec 07 Python
python将一组数分成每3个一组的实例
Nov 14 Python
Pyqt QImage 与 np array 转换方法
Jun 27 Python
python 多进程共享全局变量之Manager()详解
Aug 15 Python
Python3 使用selenium插件爬取苏宁商家联系电话
Dec 23 Python
python求一个字符串的所有排列的实现方法
Feb 04 Python
pycharm如何实现跨目录调用文件
Feb 28 Python
3分钟看懂Python后端必须知道的Django的信号机制
Jul 26 Python
解决PDF 转图片时丢文字的一种可能方式
Mar 04 Python
用python修改excel表某一列内容的操作方法
Jun 11 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
PHPlet在Windows下的安装
2006/10/09 PHP
php循环输出数据库内容的代码
2008/05/24 PHP
PHP5中使用DOM控制XML实现代码
2010/05/07 PHP
php入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
编写PHP脚本过滤用户上传的图片
2015/07/03 PHP
Zend Framework教程之Zend_Db_Table用法详解
2016/03/21 PHP
PHP字典树(Trie树)定义与实现方法示例
2017/10/09 PHP
PHP常见字符串操作函数与用法总结
2019/03/04 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
jQuery中的bind绑定事件与文本框改变事件的临时解决方法
2010/08/13 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
js实现的简单radio背景颜色选择器代码
2015/08/18 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
微信小程序实现折叠展开效果
2018/07/19 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
NodeJS读取分析Nginx错误日志的方法
2019/05/14 NodeJs
js实现数字跳动到指定数字
2020/08/25 Javascript
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
Django 后台获取文件列表 InMemoryUploadedFile的例子
2019/08/07 Python
python对常见数据类型的遍历解析
2019/08/27 Python
Python调用graphviz绘制结构化图形网络示例
2019/11/22 Python
Pymysql实现往表中插入数据过程解析
2020/06/02 Python
python为什么会环境变量设置不成功
2020/06/23 Python
让IE支持HTML5的方法
2012/12/11 HTML / CSS
html5使用canvas画空心圆与实心圆
2014/12/15 HTML / CSS
what is the difference between ext2 and ext3
2015/08/25 面试题
资深生产主管自我评价
2013/09/22 职场文书
经济信息管理专业大学生求职信
2013/09/27 职场文书
美发店5.1活动方案
2014/01/24 职场文书
先进党员事迹材料
2014/12/24 职场文书
2016国庆节67周年红领巾广播稿
2015/12/18 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA