用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实现自动登录人人网并访问最近来访者实例
Sep 26 Python
举例讲解Python中的迭代器、生成器与列表解析用法
Mar 20 Python
Python多维/嵌套字典数据无限遍历的实现
Nov 04 Python
Python中表示字符串的三种方法
Sep 06 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
Apr 10 Python
Python 读写文件的操作代码
Sep 20 Python
详解Django+uwsgi+Nginx上线最佳实战
Mar 14 Python
关于python3中setup.py小概念解析
Aug 22 Python
Django实现简单网页弹出警告代码
Nov 15 Python
Python文本处理简单易懂方法解析
Dec 19 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
Feb 05 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
May 17 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句法规则详解 入门学习
2011/11/09 PHP
PHP中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
php弹出对话框实现重定向代码
2014/01/23 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
一个符号插入器 中用到的js代码
2007/09/04 Javascript
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
JS打印gridview实现原理及代码
2013/02/05 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
jquery选择器大全 全面详解jquery选择器
2014/03/06 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
jQuery中JSONP的两种实现方式详解
2016/09/26 Javascript
手把手教你搭建ES6的开发运行环境
2017/07/11 Javascript
vue-cli构建项目使用 less的方法
2017/10/04 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
JS异步宏队列与微队列原理区别详解
2020/07/02 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
python结合API实现即时天气信息
2016/01/19 Python
python验证码识别的示例代码
2017/09/21 Python
python 实现UTC时间加减的方法
2018/12/31 Python
使用python批量化音乐文件格式转换的实例
2019/01/09 Python
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
Python字符串三种格式化输出
2020/09/17 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
Python之Sklearn使用入门教程
2021/02/19 Python
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
Myprotein台湾官方网站:全球领先的运动营养品牌
2018/12/10 全球购物
二年级语文教学反思
2014/02/02 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
兴趣班停课通知
2015/04/24 职场文书
招商银行工作证明
2015/06/17 职场文书
国富论读书笔记
2015/06/26 职场文书
解决mysql的int型主键自增问题
2021/07/15 MySQL