用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多线程编程(一):threading模块综述
Apr 05 Python
python实现八大排序算法(1)
Sep 14 Python
flask使用session保存登录状态及拦截未登录请求代码
Jan 19 Python
Python简单实现网页内容抓取功能示例
Jun 07 Python
python3.X 抓取火车票信息【修正版】
Jun 19 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
Jul 10 Python
使用Python画股票的K线图的方法步骤
Jun 28 Python
如何利用python给图片添加半透明水印
Sep 06 Python
Python pip 安装与使用(安装、更新、删除)
Oct 06 Python
40行Python代码实现天气预报和每日鸡汤推送功能
Feb 27 Python
windows下Pycharm安装opencv的多种方法
Mar 05 Python
python处理json数据文件
Apr 11 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
phpwind中的数据库操作类
2007/01/02 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
PHP删除目录及目录下所有文件的方法详解
2013/06/06 PHP
ThinkPHP实现一键清除缓存方法
2014/06/26 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
2014/11/25 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
yii,CI,yaf框架+smarty模板使用方法
2015/12/29 PHP
PHP中file_exists使用中遇到的问题小结
2016/04/05 PHP
php strftime函数的详细用法
2018/06/21 PHP
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
ElementUI radio组件选中小改造
2019/08/12 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
Python程序设计入门(4)模块和包
2014/06/16 Python
Python与shell的3种交互方式介绍
2015/04/11 Python
理解Python中的绝对路径和相对路径
2017/08/30 Python
python操作excel让工作自动化
2019/08/09 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
Python基于pyjnius库实现访问java类
2020/07/31 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
生产经理的自我评价分享
2013/11/07 职场文书
冰淇淋开店创业计划书
2014/02/01 职场文书
贸易跟单员英文求职信
2014/04/19 职场文书
学术研讨会欢迎词
2015/01/26 职场文书
长城的导游词
2015/01/30 职场文书
寒假安全保证书
2015/02/28 职场文书
2015年化验室工作总结
2015/04/23 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
Java使用jmeter进行压力测试
2021/07/09 Java/Android