用sqlalchemy构建Django连接池的实例
作者:pushiqiang 发布时间:2021-09-22 20:20:30
都知道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连接池的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
来源:https://blog.csdn.net/pushiqiang/article/details/51152755
猜你喜欢
- 本文主要介绍了Python3中PyQt5简单实现文件打开及保存,分享给大家,具体如下:# -*- coding: utf-8 -*-# Fo
- Oracle text是Oracle的全文检索技术,是9i版本标准版和企业版的一部分。Oracle text使用标准的sql语言索引、查找、
- goto语句在Go编程语言中的goto语句提供无条件跳转从跳转到标记声明的功能。注意:使用goto语句是高度劝阻的在任何编程语言,因为它使得
- css usage是一个基于firebug的firefox扩展,可以用来查看页面中的CSS的使用情况,可以清楚的查看css文件中所有的规则在
- 以下代码可自动登录12306 - 包括输入用户名密码以及自动识别验证码并点击验证码登陆。该源码需要稍作修改:把 username
- 当使用MySQL做站点的时候,肯定会有不知道的错误发生,怎么记录呢?以下是具体解决方法:class.method //建立错误日志 func
- 公司一个项目需要上传图片,一开始同事将图片上传后结合当前主机拼成了一个绝对的URL(http://192.168.1.1:888/m/get
- using System; using System.Data; using System.Configuration; using Sys
- 本文实例讲述了Python数据类型之Tuple元组。分享给大家供大家参考,具体如下:tuple元组1.概述本质上是一种有序的集合,和列表非常
- $r = new ReflectionClass($this); Zend_Debug::dump($r->getConstants(
- 本文实例讲述了python判断字符串是否纯数字的方法。分享给大家供大家参考。具体如下:判断的代码如下,通过异常判断不能区分前面带正负号的区别
- 本文实例讲述了用python实现面向对像的ASP程序的方法。分享给大家供大家参考。具体实现方法如下:平时我们写ASP时,一般都用vbscri
- 是在客户端确认还是在服务器端确认? <SCRIPT LANGUAGE="VBSc
- 想到TDE(Transparent Data Encryption)。 TDE MSDN 说明: “透明数据加密”(TDE) 可对数据和日志
- 发送电子邮件在即时通信软件如此发达的今天,电子邮件仍然是互联网上使用最为广泛的应用之一,公司向应聘者发出录用通知、网站向用户发送一个激活账号
- innerHTML,outerHTML innerHTML检索或设置标签内的内容;outerHTML检索或设置整个标签的内容(包含标签)。&
- Python使用称为Python Path的搜索路径来查找使用import语句导入代码的模块。大多数代码只会汇入已经默认路径上的模块,通过安
- 接下来我们会进入 字符串常用方法的应用阶段,重点学习字符串的内置函数。正式学习之前,我们要先了解一个词 对象 (划重点,不是男女朋友!),只
- 为了建设班级主页,买了个空间,支持SA FileUp组件。鼓弄了一天,终于有了大致的了解,下面是我的实例,希望对大家有所帮助。大家可以根据自
- 原始生成对抗网络Generative Adversarial Networks GAN包含生成器Generator和判别器Discrimin