一、DBUtils

DBUtils是Python的一个用于实现数据库连接池的模块。

连接池的三种模式:

第一种模式:

            它的缺点:每一次请求反复创建数据库的链接,链接的次数太多

from flask import Flask
from db import POOL
import pymysql
app = Flask(__name__)
app.secret_key ='sdfsdfsdf'@app.route('/index')
def index():# 第一步:缺点:每次请求反复创建数据库连接,连接数太多# conn = pymysql.connect()# cursor = conn.cursor()# cursor.execute('select * from tb where id > %s',[5,])# result = cursor.fetchall()# cursor.close()# conn.close()# print(result)return '执行成功'if __name__ == '__main__':# app.__call__app.run()

模式一

第二种模式:

           它的缺点:不能支持并发

from flask import Flask
from db import POOL
import pymysql
app = Flask(__name__)
app.secret_key ='sdfsdfsdf'@app.route('/index')
def index():# 第二步:缺点,不能支持并发# pymysql.threadsafety# with LOCK:#     cursor = CONN.cursor()#     cursor.execute('select * from tb where id > %s', [5, ])#     result = cursor.fetchall()#     cursor.close()return '执行成功'if __name__ == '__main__':# app.__call__app.run()

模式二

第三种模式:

          它是基于DBUtils实现数据库连接池

                  -为每个线程创建一个链接,该线程关闭时,不是真正的关闭,本线程再次调用时,还是使用的最开始的创建的链接,知道线程终止,数据库链接才关闭

                  -创建一个连接池(10个链接),为所有线程提供链接,使用时来进行获取,使用完毕时,再次放回到连接池。

from flask import Flask
from db import POOL
import pymysql
app = Flask(__name__)
app.secret_key ='sdfsdfsdf'@app.route('/index')
def index():# 第三步:基于DBUtils实现数据连接池#         - 为没个线程创建一个连接,该线程关闭时,不是真正关闭;本线程再次调用时,还是使用的最开始创建的连接。直到线程终止,数据库连接才关闭。#         - 创建一个连接池(10个连接),为所有线程提供连接,使用时来进行获取,使用完毕后,再次放回到连接池。#         PS:conn = POOL.connection()cursor = conn.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()conn.close()return '执行成功'if __name__ == '__main__':# app.__call__app.run()

模式三

DBUtils的应用:

import time
import pymysql
import threading
from DBUtils.PooledDB import PooledDB, SharedDBConnection
POOL = PooledDB(creator=pymysql,  # 使用链接数据库的模块maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建maxcached=5,  # 链接池中最多闲置的链接,0和None不限制maxshared=3,  # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]ping=0,# ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = alwayshost='127.0.0.1',port=3306,user='root',password='123',database='pooldb',charset='utf8'
)

本地线程:

import threading
import time
# 本地线程对象
local_values = threading.local()def func(num):"""# 第一个线程进来,本地线程对象会为他创建一个# 第二个线程进来,本地线程对象会为他创建一个{线程1的唯一标识:{name:1},线程2的唯一标识:{name:2},}:param num: :return: """local_values.name = num # 4# 线程停下来了time.sleep(2)# 第二个线程: local_values.name,去local_values中根据自己的唯一标识作为key,获取value中name对应的值print(local_values.name, threading.current_thread().name)for i in range(5):th = threading.Thread(target=func, args=(i,), name='线程%s' % i)th.start()

本地线程

模式一:

"""
为每个线程创建一个连接,thread.local实现。"""from DBUtils.PersistentDB import PersistentDB
import pymysqlPOOL = PersistentDB(creator=pymysql,  # 使用链接数据库的模块maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]ping=0,# ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = alwayscloseable=False,# 如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接(pool.steady_connection()可以获取一个新的链接)threadlocal=None,  # 本线程独享值得对象,用于保存链接对象,如果链接对象被重置host='127.0.0.1',port=3306,user='root',password='123',database='pooldb',charset='utf8'
)def func():# conn = SteadyDBConnection()conn = POOL.connection()cursor = conn.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()cursor.close()conn.close() # 不是真的关闭,而是假的关闭。 conn = pymysql.connect()   conn.close()
conn = POOL.connection()cursor = conn.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()cursor.close()conn.close()import threadingfor i in range(10):t = threading.Thread(target=func)t.start()

模式一

模式二:

import time
import pymysql
import threading
from DBUtils.PooledDB import PooledDB, SharedDBConnection
POOL = PooledDB(creator=pymysql,  # 使用链接数据库的模块maxconnections=6,  # 连接池允许的最大连接数,0和None表示不限制连接数mincached=2,  # 初始化时,链接池中至少创建的空闲的链接,0表示不创建
maxcached=5,  # 链接池中最多闲置的链接,0和None不限制maxshared=3,  # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。blocking=True,  # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错maxusage=None,  # 一个链接最多被重复使用的次数,None表示无限制setsession=[],  # 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."]ping=0,# ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = alwayshost='127.0.0.1',port=3306,user='root',password='123',database='pooldb',charset='utf8'
)def func():# 检测当前正在运行连接数的是否小于最大链接数,如果不小于则:等待或报raise TooManyConnections异常# 否则# 则优先去初始化时创建的链接中获取链接 SteadyDBConnection。# 然后将SteadyDBConnection对象封装到PooledDedicatedDBConnection中并返回。# 如果最开始创建的链接没有链接,则去创建一个SteadyDBConnection对象,再封装到PooledDedicatedDBConnection中并返回。# 一旦关闭链接后,连接就返回到连接池让后续线程继续使用。# PooledDedicatedDBConnectionconn = POOL.connection()# print(th, '链接被拿走了', conn1._con)# print(th, '池子里目前有', pool._idle_cache, '\r\n')
cursor = conn.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()conn.close()conn = POOL.connection()# print(th, '链接被拿走了', conn1._con)# print(th, '池子里目前有', pool._idle_cache, '\r\n')
cursor = conn.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()conn.close()func()

模式二

转载于:https://www.cnblogs.com/mengqingjian/p/8206477.html

Python-flask中数据库连接池DBUtils相关推荐

  1. python 数据库连接池DBUtils

    python 数据库连接池DBUtils 0x00 简述 0x01 摘要 0x02 模块 0x03 下载及安装 1.下载 2.安装 0x04 SimplePooledDB 0x05 SteadyDB ...

  2. Python操作数据库及Python实现mysql数据库连接池源代码

    简介 pymysql:纯Python实现的一个驱动.因为是纯Python编写的,因此执行效率不如MySQL-python.并且也因为是纯Python编写的,因此可以和Python代码无缝衔接. MyS ...

  3. Python Flask 中的路由

    Python Flask 中的路由 在 Web 应用中,接口一般都是遵守 RESTful API 设计风格的,这种风格很优雅,而且对用户来说非常易于理解. RESTful API 参考:https:/ ...

  4. python中config(state=disabled)_解决python flask中config配置管理的问题

    在项目中我们需要配置各种环境.如果我们的配置项很少的话,可以直接简单粗暴的来: 比如: app =Flask(__name__) app.config['DEBUG']=True app.config ...

  5. python数据库连接池工具类_Python数据库连接池DBUtils

    DBUtils简介 DBUtils是Python的一个用于实现数据库连接池的模块. 此连接池有两种连接模式: 模式一:为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放 ...

  6. Python数据库连接池DBUtils

    DBUtils是Python的一个用于实现数据库连接池的模块 此连接池有两种连接模式: DBUtils提供两种外部接口:     PersistentDB :提供线程专用的数据库连接,并自动管理连接. ...

  7. 【Python SQLAlchemy】数据库连接池SQLAlchemy中多线程安全的问题

    问题描述 写了一个apscheduler定时任务 里面用到SQLAlchemy在同一时间点开启了18个任务,用于更新18个表 但是最终看数据库表的时候,发现有2个表未更新.查看打印日志均正常,查找原因 ...

  8. Python封装mysqloracle数据库连接池

    零.综述: python 封装myslq.oracle连接池. 但是现在有个bug,就是线程不安全的问题,如果多个线程,同时启动,会创建多个线程池.(如果多个线程,不同时启动,会共用一个线程池),后续 ...

  9. java中数据库连接池_Java中的数据库连接池

    本文译自Baeldung的博客 概述 连接池是一种众所周知的数据库访问模式,主要目的是减少创建数据库连接和读/写数据库操作的开销. 简单来说,连接池本质上就是数据库连接缓存的一种实现方式,可以通过对其 ...

  10. Python 多进程与数据库连接池配合同时取出数据进行处理

    1 引入问题:曾经想过用分布式来处理,但是似乎并不需要那么麻烦,使用Python 数据库连接池与Python 进程池,同时对数据的读取与处理. 这里就不赘述连接池怎么建立了,主要是Python 进程池 ...

最新文章

  1. nginx+keepalived
  2. python isalpha()
  3. php adodb smarty,smarty+adodb+部分自定义类的php开发模式
  4. 【C语言进阶深度学习记录】十一 C语言中enum,sizeof,typedef分析
  5. 面向数据自治开放的数据盒模型
  6. jQuery复制table header到表格的最下面
  7. 心理正常与异常的区分_教师培训 | 学生常见心理问题的表现与识别
  8. reportgen :python生产pptx
  9. python.集合转列表_python 列表,元组,字典,集合,字符串相互转换
  10. 白皮 Chapter 1
  11. 获取浏览器选中文本并操作
  12. 大数据架构方案总结-ljt(转载)
  13. c语言分析工具——函数调用关系生成图像、流程图生成器
  14. 很好用的邮件发送软件mutt
  15. Egret 配置主题
  16. 传智java完整教学视频
  17. PHP生成一寸照片代码,ps做一寸证件照的步骤
  18. 转---蓝海战略之父重谈“蓝海”
  19. 微信自定义分享链接信息(标题,图片和内容)实现过程详解
  20. 界下科技:移动支付成银行卡产业竞合焦点

热门文章

  1. c标准语言库里的i o函数,C语言文件I/O和标准I/O函数
  2. 如何使用JdbcTemplate实现数据的增删改查?
  3. element ui 选项卡切换_Vue.js + element-ui 扫盲(服务端对大前端的扫盲)
  4. latex 引用网页 网址 网站 格式
  5. kubectl apply -f weave.yaml之后dns没有启动起来 weave-net CrashLoopBackOff
  6. css html实现粒子特效,CSS实现粒子动态按钮效果
  7. php中点号是什么意思,深入解析PHP中逗号与点号的区别
  8. SpringBoot4.5.2 整合HikariCP 数据库连接池
  9. 每一个写博客的程序猿,都应该被温柔对待
  10. 洛谷 P2879 [USACO07JAN]区间统计Tallest Cow