用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中AND、OR的一个使用小技巧
Feb 18 Python
Python实现将xml导入至excel
Nov 20 Python
Python 由字符串函数名得到对应的函数(实例讲解)
Aug 10 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
Python的地形三维可视化Matplotlib和gdal使用实例
Dec 09 Python
Python KMeans聚类问题分析
Feb 23 Python
利用Python查看微信共同好友功能的实现代码
Apr 24 Python
将Pytorch模型从CPU转换成GPU的实现方法
Aug 19 Python
python图像处理模块Pillow的学习详解
Oct 09 Python
python 中值滤波,椒盐去噪,图片增强实例
Dec 18 Python
通过python调用adb命令对App进行性能测试方式
Apr 23 Python
详解python的xlwings库读写excel操作总结
Feb 26 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几个预定义变量$_SERVER用法小结
2014/11/07 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
php创建桌面快捷方式实现方法
2015/12/31 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
2019/05/06 PHP
jQuery中bind,live,delegate与one方法的用法及区别解析
2013/12/30 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
JavaScript位移运算符(无符号) >>> 三个大于号 的使用方法详解
2016/03/31 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
extjs图表绘制之条形图实现方法分析
2020/03/06 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
几个提升Python运行效率的方法之间的对比
2015/04/03 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
python 五子棋如何获得鼠标点击坐标
2019/11/04 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
应届毕业生的自我鉴定
2013/11/13 职场文书
田径运动会开幕式及主持词
2014/03/28 职场文书
财务部副经理岗位职责范本
2014/06/17 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
干部作风建设心得体会
2014/10/22 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
机关干部纪律作风整顿心得体会
2016/01/23 职场文书
为什么 Nginx 比 Apache 更牛逼
2021/03/31 Servers
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
2021/05/14 Python
MySQL 那些常见的错误设计规范,你都知道吗
2021/07/16 MySQL
前端JavaScript大管家 package.json
2021/11/02 Javascript
HTML页面中使两个div并排显示的实现
2022/05/15 HTML / CSS
聊聊配置 Nginx 访问与错误日志的问题
2022/05/25 Servers