用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使用arp欺骗伪造网关的方法
Apr 24 Python
python回调函数用法实例分析
May 09 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
Aug 08 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
Dec 14 Python
python文件写入write()的操作
May 14 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
Jul 04 Python
Python实现微信翻译机器人的方法
Aug 13 Python
Python动态声明变量赋值代码实例
Dec 30 Python
pyqt5中动画的使用详解
Apr 01 Python
详解python logging日志传输
Jul 01 Python
Python通过字典映射函数实现switch
Nov 06 Python
python快速安装OpenCV的步骤记录
Feb 22 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
各种战术和打法的原创者
2020/03/04 星际争霸
PHP学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
PHP中数据库单例模式的实现代码分享
2014/08/21 PHP
零基础php编程好学吗
2019/10/11 PHP
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
通过Javascript创建一个选择文件的对话框代码
2012/06/16 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
2016/01/27 Javascript
EsLint入门学习教程
2017/02/17 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
JavaScript选择排序算法原理与实现方法示例
2018/08/06 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
2019/07/10 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
Python数组遍历的简单实现方法小结
2016/04/27 Python
Python科学计算之Pandas详解
2017/01/15 Python
Python 实现12306登录功能实例代码
2018/02/09 Python
Python3.5面向对象与继承图文实例详解
2019/04/24 Python
python自动结束mysql慢查询会话的实例代码
2019/10/27 Python
浅谈优化Django ORM中的性能问题
2020/07/09 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
CSS3制作翻转效果_动力节点Java学院整理
2017/07/11 HTML / CSS
2019年.net常见面试问题
2012/02/12 面试题
护理职业应聘自荐书
2013/09/29 职场文书
公司综合部的成员自我评价分享
2013/11/05 职场文书
个性发展自我评价
2014/02/11 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
2014镇副书记群众路线专题民主生活会思想汇报
2014/09/23 职场文书
思想道德自我评价2015
2015/03/09 职场文书
债务纠纷起诉书
2015/05/20 职场文书
2016庆祝国庆67周年宣传语
2015/11/25 职场文书
2016年清明节寄语
2015/12/04 职场文书
JavaScript 与 TypeScript之间的联系
2021/11/27 Javascript
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS
不负正版帝国之名 《重返帝国》引领SLG手游制作新的标杆
2022/04/07 其他游戏
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python