浅谈django url请求与数据库连接池的共享问题


Posted in Python onAugust 29, 2019

但凡介绍数据库连接池的文章,都会说“数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。”

这句话虽然说得很好,但也很让人疑惑。比如,多个请求是怎样共用数据库连接池啊?

其实,数据库连接池主要是利用了程序,静态变量与静态方法的概念实现的。静态变量和静态方法,是程序运行时,就被加载到内存中的。该进程中所有对于它的访问,都是对“唯一”的它的访问。所以,才能有数据库连接池被共享的概念。

浅谈django url请求与数据库连接池的共享问题

可以看到,静态变量a以及静态方法add,即使类A从未被实例化过,它们也都会被加载到内存中。

另外,在python的此次运行(一个进程)中,多次对a的操作,都是对为一个的这个a变量的操作,所以它的值是在被操作后累加的。

这个在我上面简单的例子中很好理解。那么如何理解Web应用程序(如django程序)在接到url请求时的场景呢?在多个请求时,他们是如何可以共享数据库连接池的?

我写了一个简单的例子:

Test model,使用了单例模式,它的功能是调用sqlalchemy.pool中的数据库连接池。

浅谈django url请求与数据库连接池的共享问题

而views.py的index方法,则是调用Test的getinstance方法获得它的实例,同时用它的数据库连接池。

浅谈django url请求与数据库连接池的共享问题

为了看得清楚,我在这个方法中增加打印了当前所属进程的pid,test和test.connpool信息。

首先要说明一点,apache在windows和linux中的运行方式不尽相同(windows是两个httpd进程,一个父进程,一个子进程,子进程里面多个线程处理请求)。在linux中,默认用prefork的方式运行。即一个父进程,多个子进程,这多个子进程负责处理web请求。

如下图所示:

浅谈django url请求与数据库连接池的共享问题

然后我们尝试多次url请求(适当变化url,避免缓存);并记录结果:

http://10.67.2.21:8081/ips/
count:3,processid:20016<br/>test:<ipsapp.models.Test object at 0x7f2b1070ac50>,connpool:<sqlalchemy.pool.QueuePool object at 0x7f2b1070ad10>

http://10.67.2.21:8081/ips/?user=kjsdkfjsdf&kljsdlkfjsdf
count:3,processid:20013<br/>test:<ipsapp.models.Test object at 0x7f2b107c6c10>,connpool:<sqlalchemy.pool.QueuePool object at 0x7f2b107c6cd0>

http://10.67.2.21:8081/ips/?user=kjsdkfjsdf&kljsdlkfjsdf&pass=ksjdkjdf
count:3,processid:20018<br/>test:<ipsapp.models.Test object at 0x7f2b103c6c50>,connpool:<sqlalchemy.pool.QueuePool object at 0x7f2b103c6d10>

http://10.67.2.21:8081/ips/?user=123u42i3u4
count:3,processid:20016<br/>test:<ipsapp.models.Test object at 0x7f2b1070ac50>,connpool:<sqlalchemy.pool.QueuePool object at 0x7f2b1070ad10>

http://10.67.2.21:8081/ips/?user=123u42i3u4&tewstsjdfkjslfj
count:3,processid:20013<br/>test:<ipsapp.models.Test object at 0x7f2b107c6c10>,connpool:<sqlalchemy.pool.QueuePool object at 0x7f2b107c6cd0>

http://10.67.2.21:8081/ips/?user=passwode
count:3,processid:20018<br/>test:<ipsapp.models.Test object at 0x7f2b103c6c50>,connpool:<sqlalchemy.pool.QueuePool object at 0x7f2b103c6d10>

http://10.67.2.21:8081/ips/?newiusd=kjsdkjfd&kjsdkjf=ksdjflksjdlkf
count:3,processid:20016<br/>test:<ipsapp.models.Test object at 0x7f2b1070ac50>,connpool:<sqlalchemy.pool.QueuePool object at 0x7f2b1070ad10>

apache pid Test object QueuePool object
20016 0x7f2b1070ac50 0x7f2b1070ad10
20013 0x7f2b107c6c10 0x7f2b107c6cd0
20018 0x7f2b103c6c50 0x7f2b103c6d10
20016 0x7f2b1070ac50 0x7f2b1070ad10
20013 0x7f2b107c6c10 0x7f2b107c6cd0
20018 0x7f2b103c6c50 0x7f2b103c6d10
20016 0x7f2b1070ac50 0x7f2b1070ad10

我把分属于不同apache进程处理的请求用颜色标出了,在本例子中,7个请求,分配到了3个apache进程处理。可以看到,被同一个apache子进程处理的请求,是共用同一个test和test.connpool实例的,即他们共享数据库连接池。

所以,数据库连接池,对于web请求而言,是属于同一个apache子进程处理的请求共用一个数据库连接池。

以上这篇浅谈django url请求与数据库连接池的共享问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python进程类subprocess的一些操作方法例子
Nov 22 Python
Python中的字符串类型基本知识学习教程
Feb 04 Python
Python解惑之整数比较详解
Apr 24 Python
基于python socketserver框架全面解析
Sep 21 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
Nov 23 Python
详解Python核心对象类型字符串
Feb 11 Python
python可视化实现代码
Jan 15 Python
华为校园招聘上机笔试题 扑克牌大小(python)
Apr 22 Python
python-django中的APPEND_SLASH实现方法
Jun 21 Python
Xadmin+rules实现多选行权限方式(级联效果)
Apr 07 Python
python基础之函数的定义和调用
Oct 24 Python
python 进程的几种创建方式详解
Aug 29 #Python
python 列表推导式使用详解
Aug 29 #Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 #Python
解决Django连接db遇到的问题
Aug 29 #Python
Python pandas实现excel工作表合并功能详解
Aug 29 #Python
python openCV获取人脸部分并存储功能
Aug 28 #Python
python lambda表达式在sort函数中的使用详解
Aug 28 #Python
You might like
php上传图片存入数据库示例分享
2014/03/11 PHP
PHP读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
php自动加载方式集合
2016/04/04 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
php安装dblib扩展,连接mssql的具体步骤
2017/03/02 PHP
Zend Framework框架中实现Ajax的方法示例
2017/06/27 PHP
JavaScript定义类或函数的几种方式小结
2011/01/09 Javascript
基于jquery的文本框与autocomplete结合使用(asp.net+json)
2012/05/30 Javascript
浅析showModalDialog数据缓存问题(用禁止浏览器缓存解决)
2013/07/09 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
2015/10/12 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
微信小程序登录按钮遮罩浮层效果的实现方法
2018/12/16 Javascript
Layui实现数据表格默认全部显示(不要分页)
2019/10/26 Javascript
javascript/jquery实现点击触发事件的方法分析
2019/11/11 jQuery
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
[44:22]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第一场 11.01
2020/11/02 DOTA
浅谈Python的文件类型
2016/05/30 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
详解Python 调用C# dll库最简方法
2019/06/20 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
JAVA SWT事件四种写法实例解析
2020/06/05 Python
5款实用的python 工具推荐
2020/10/13 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
春节联欢晚会主持词范文
2014/03/24 职场文书
2015年营业员工作总结
2015/04/23 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
教师读书活动心得体会
2016/01/14 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书