用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

标签:sqlalchemy,Django,连接池
0
投稿

猜你喜欢

  • 一直闪烁变色的超级链接代码

    2008-02-27 13:08:00
  • Python数据结构与算法之算法分析详解

    2022-05-15 19:03:46
  • MySQL日志的详细分析实例

    2024-01-25 21:35:52
  • 完美解决go Fscanf 在读取文件时出现的问题

    2024-02-15 11:29:50
  • Go语言流程控制之goto语句与无限循环

    2023-08-31 06:43:00
  • python神经网络Keras GhostNet模型的实现

    2022-05-16 17:19:42
  • JS实现键值对遍历json数组功能示例

    2024-04-10 10:52:40
  • 评论是倒序好还是顺序好?

    2007-11-09 10:40:00
  • 数字人组件反写[asp组件开发实例3]

    2009-06-09 13:16:00
  • 利用js实现简易红绿灯

    2024-04-22 22:30:02
  • python 采集中文乱码问题的完美解决方法

    2021-05-13 13:46:58
  • Python 中对 XML 文件的编码转换问题

    2022-08-19 12:46:53
  • 通过Python 获取Android设备信息的轻量级框架

    2021-08-18 21:41:00
  • asp如何处理页面执行时发生的错误?

    2009-11-14 20:43:00
  • 怎样设计"帮助"最有效?

    2008-04-12 14:18:00
  • python基础之装饰器详解

    2022-05-22 15:26:38
  • 完美解决SQL server2005中插入汉字变成问号的问题

    2024-01-24 20:59:59
  • python读取Excel表格文件的方法

    2023-07-24 01:17:14
  • Python中装饰器高级用法详解

    2023-09-30 09:46:42
  • python实现定时提取实时日志程序

    2023-03-03 22:31:24
  • asp之家 网络编程 m.aspxhome.com