用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之??碌某?? target=
Sep 12 Python
python实现自动登录人人网并访问最近来访者实例
Sep 26 Python
探究Python中isalnum()方法的使用
May 18 Python
Python使用jsonpath-rw模块处理Json对象操作示例
Jul 31 Python
基于随机梯度下降的矩阵分解推荐算法(python)
Aug 31 Python
用python标准库difflib比较两份文件的异同详解
Nov 16 Python
Python目录和文件处理总结详解
Sep 02 Python
Python传递参数的多种方式(小结)
Sep 18 Python
Python SQLAlchemy入门教程(基本用法)
Nov 11 Python
pytorch实现对输入超过三通道的数据进行训练
Jan 15 Python
Python使用socket_TCP实现小文件下载功能
Oct 09 Python
python实现在列表中查找某个元素的下标示例
Nov 16 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 screw加密php源代码
2013/06/20 PHP
Chrome Web App开发小结
2014/09/04 PHP
php中fgetcsv()函数用法实例
2014/11/28 PHP
php动态变量定义及使用
2015/06/10 PHP
JQuery打造PHP的AJAX表单提交实例
2009/11/03 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
JS辨别访问浏览器判断是android还是ios系统
2014/08/19 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
2017/04/27 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
2017/08/14 jQuery
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
Vue 进阶之路(三)
2019/04/18 Javascript
jQuery实现简单QQ聊天框
2020/08/27 jQuery
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
Python实现的knn算法示例
2018/06/14 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
ubuntu 16.04下python版本切换的方法
2019/06/14 Python
Python 绘制酷炫的三维图步骤详解
2019/07/12 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
.net软件工程师面试题
2015/03/31 面试题
酒店司机岗位职责
2013/12/14 职场文书
九年级语文教学反思
2014/02/04 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
停课通知书
2015/04/24 职场文书
远程教育学习心得体会
2016/01/23 职场文书
如何写好竞聘报告
2019/04/03 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
Win10本地连接不见了怎么恢复? win10系统电脑本地连接不见了解决方法
2023/01/09 数码科技