用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 相关文章推荐
10个易被忽视但应掌握的Python基本用法
Apr 01 Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 Python
Python实现基于POS算法的区块链
Aug 07 Python
python正则表达式匹配[]中间为任意字符的实例
Dec 25 Python
Python 实现取多维数组第n维的前几位
Nov 26 Python
Python time库基本使用方法分析
Dec 13 Python
基于Python 中函数的 收集参数 机制
Dec 21 Python
Python中使用threading.Event协调线程的运行详解
May 02 Python
浅谈django框架集成swagger以及自定义参数问题
Jul 07 Python
Python 代码调试技巧示例代码
Aug 11 Python
Python自动化测试中yaml文件读取操作
Aug 20 Python
python可视化之颜色映射详解
Sep 15 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 星际争霸
Body是什么,该怎么喝出咖啡里的口感
2021/03/03 咖啡文化
PHP 中文处理技巧
2010/04/25 PHP
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
2011/05/24 Javascript
jQuery实现拖动调整表格单元格大小的代码实例
2015/01/13 Javascript
JavaScript toUpperCase()方法使用详解
2016/08/26 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
Nodejs实现短信验证码功能
2017/02/09 NodeJs
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
2019/04/29 Javascript
Python类的基础入门知识
2008/11/24 Python
Python实现过滤单个Android程序日志脚本分享
2015/01/16 Python
windows下python连接oracle数据库
2017/06/07 Python
numpy matrix和array的乘和加实例
2018/06/28 Python
python getpass模块用法及实例详解
2019/10/07 Python
pygame实现俄罗斯方块游戏(基础篇1)
2019/10/29 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
HealthElement海外旗舰店:新西兰大卖场
2018/02/23 全球购物
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
Bluebella美国官网:英国性感内衣品牌
2018/10/04 全球购物
营销主管自我评价怎么写
2013/09/19 职场文书
董事长职责范文
2013/11/08 职场文书
人事主管岗位职责范本
2013/12/04 职场文书
料理师求职信
2014/01/30 职场文书
初中生自我鉴定
2014/02/04 职场文书
青春演讲稿范文
2014/05/08 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
研究生简历自我评
2015/03/11 职场文书
祝寿主持词
2015/07/02 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
MySQL常用慢查询分析工具详解
2022/08/14 MySQL