用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连接sql server乱码的解决方法
Jan 28 Python
对python中return和print的一些理解
Aug 18 Python
如何高效使用Python字典的方法详解
Aug 31 Python
Python中的pygal安装和绘制直方图代码分享
Dec 08 Python
python+pandas分析nginx日志的实例
Apr 28 Python
python实现单链表中删除倒数第K个节点的方法
Sep 28 Python
Python查找文件中包含中文的行方法
Dec 19 Python
python多线程调用exit无法退出的解决方法
Feb 18 Python
libreoffice python 操作word及excel文档的方法
Jul 04 Python
python爬虫神器Pyppeteer入门及使用
Jul 13 Python
Django model重写save方法及update踩坑详解
Jul 27 Python
Python如何实现Paramiko的二次封装
Jan 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 文件上传功能实现代码
2009/06/24 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
PHP中实现中文字符进制转换原理分析
2011/12/06 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
javascript与CSS复习(三)
2010/06/29 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
js随机颜色代码的多种实现方式
2013/04/23 Javascript
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
2013/06/17 Javascript
jquery ui dialog实现弹窗特效的思路及代码
2013/08/03 Javascript
javascript实现获取字符串hash值
2015/05/10 Javascript
JS实现定时自动关闭DIV层提示框的方法
2015/05/11 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
Google Maps基础及实例解析
2016/08/06 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
2019/05/05 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
python 图片验证码代码
2008/12/07 Python
pymongo实现控制mongodb中数字字段做加法的方法
2015/03/26 Python
Python实现二叉堆
2016/02/03 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
2018/08/16 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
英国在线药房和在线医生:LloydsPharmacy
2019/10/21 全球购物
英国最好的包装供应商:Priory Direct
2019/12/17 全球购物
Linux不知道文件后缀名怎么判断文件类型
2012/04/26 面试题
综合实践活动总结
2014/05/05 职场文书
后备干部培训方案
2014/05/22 职场文书
小学教师年度个人总结
2015/02/05 职场文书
事业单位岗位说明书
2015/10/08 职场文书
《花钟》教学反思
2016/02/17 职场文书
导游词之上饶龟峰
2019/10/25 职场文书
windows11怎么查看wifi密码? win11查看wifi密码的技巧
2021/11/21 数码科技
Redis Lua脚本实现ip限流示例
2022/07/15 Redis