用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的random模块及加权随机算法的python实现方法
Jan 04 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
Nov 23 Python
wxpython实现图书管理系统
Mar 12 Python
浅谈django rest jwt vue 跨域问题
Oct 26 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 Python
jupyter notebook 多环境conda kernel配置方式
Apr 10 Python
Python json转字典字符方法实例解析
Apr 13 Python
Python可以用来做什么
Nov 23 Python
python 实现数据库中数据添加、查询与更新的示例代码
Dec 07 Python
Python自动化爬取天眼查数据的实现
Jun 15 Python
Python中的套接字编程是什么?
Jun 21 Python
基于Python编写简易版的天天跑酷游戏的示例代码
Mar 23 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/11/04 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
2015/12/22 PHP
js不是基础的基础
2006/12/24 Javascript
北京奥运官方网站幻灯切换效果flash版打包下载
2008/01/30 Javascript
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
jquery实现心算练习代码
2010/12/06 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
JavaScript、jQuery与Ajax的关系
2016/01/24 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
2016/08/02 Javascript
jQuery EasyUI右键菜单实现关闭标签/选项卡
2016/10/10 Javascript
JS实现电商放大镜效果
2017/08/24 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
2018/09/05 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
Python文件读写保存操作的示例代码
2018/09/14 Python
python使用多进程的实例详解
2018/09/19 Python
python-opencv 将连续图片写成视频格式的方法
2019/01/08 Python
python实现对输入的密文加密
2019/03/20 Python
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
工程管理造价应届生求职信
2013/11/13 职场文书
优秀实习自我鉴定
2013/12/04 职场文书
广告学毕业生求职信
2014/01/30 职场文书
护士自我评价
2014/02/01 职场文书
机电一体化毕业生自荐信
2014/06/19 职场文书
领导干部学习“三严三实”思想汇报
2014/09/15 职场文书
幼儿学前班评语
2014/12/29 职场文书
幼儿教师辞职信
2015/02/27 职场文书
党员证明模板
2015/06/19 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书
spring boot实现文件上传
2022/08/14 Java/Android
Spring Boot实现文件上传下载
2022/08/14 Java/Android
CentOS7设置ssh服务以及端口修改方式
2022/12/24 Servers