模块 描述
SimplePooledDB 不在生产环境中使用
PersistentDB 线程仿射( thread-affine ),持久化的数据库连接,为每个线程开启一个连接,直到线程终止,线程永远不共享连接
PooledDB 共享连接池

PersistentDB


例子

import pymysql
from DBUtils.PersistentDB import PersistentDBPOOL = 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 = POOL.connection(shareable=False)cursor = conn.cursor()cursor.execute('select * from test')result = cursor.fetchall()cursor.close()conn.close()
func()

PooledDB

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,  # 无效,永远共享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='root',database='ss',charset='utf8'
)def func():conn = POOL.connection()cursor = conn.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()conn.close()
func()

为什么要使用数据库连接池

1.避免重复连接
1)用户每次访问,都会建立一次连接,浪费资源
2)多用户同时访问,过多建立连接,数据库可能崩溃

from flask import Flask
app = Flask(__name__)@app.route("/")
def hello():import pymysqlCONN = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='root',database='ss',charset='utf8')cursor = CONN.cursor()cursor.execute('select * from test')result = cursor.fetchall()cursor.close()print(result)return "Hello World"if __name__ == '__main__':app.run()

2.多线程不安全
虽然在全局建立了一个连接,但是多用户访问时用的是同一个数据库连接,这个时候就不安全

from flask import Flask
app = Flask(__name__)
import pymysql
CONN = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='root',database='ss',charset='utf8')
@app.route("/")
def hello():cursor = CONN.cursor()cursor.execute('select * from test')result = cursor.fetchall()cursor.close()print(result)return "Hello World"
if __name__ == '__main__':app.run()

3.加锁后,性能降低
为了克服多线程不安全,在连接时使用锁,这样虽然安全,但是效率会变得非常低

from flask import Flask
import threading
app = Flask(__name__)
import pymysql
CONN = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123',database='pooldb',charset='utf8')@app.route("/")
def hello():with threading.Lock():cursor = CONN.cursor()cursor.execute('select * from test')result = cursor.fetchall()cursor.close()print(result)return "Hello World"if __name__ == '__main__':app.run()

参考:
https://www.cnblogs.com/sxh-myblogs/p/8227615.html
https://www.codercto.com/a/53862.html

Python DButils相关推荐

  1. python DbUtils 封装

    python dbutils 简介及准备工作 dbutils封装文件传送门 DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装.DBUtils来自Webwa ...

  2. python - DBUtils 连接池减少oracle数据库的连接数

    问题: 接到需求,告知项目的oracle连接次数过多,对系统造成太过大的负担,要求减少oracle数据库的连接次数 分析: 仔细分析代码以后,发现产生问题的原因,在于之前要求提升oracle监控的监控 ...

  3. python DbUtils 使用教程

    下载: https://pypi.python.org/pypi/DBUtils/1.2 先下载你要安装的包,并解压到磁盘下: 进入到该文件的setup.py 目录下 ,打开cmd,并切换到该目录下:

  4. python mysql api_python mysql api

    windows下面的python的MySQLdb环境安装配置 学习交流群127591054. 为了用DB-API编写MySQL脚本,必须确保已经安装了MySQL.复制以下代码,并执行: -# -- c ...

  5. vue vuex 挂载_vue.js,javascript_Vuex的初始化失败,一直显示没有挂载到根组件上,奇怪了!,vue.js,javascript - phpStudy...

    Vuex的初始化失败,一直显示没有挂载到根组件上,奇怪了! 代码如下 import 'babel-polyfill' import Vue from 'vue' import VueRouter fr ...

  6. python调用libs.dbutil_Python 使用 PyMysql、DBUtils 创建连接池,提升性能

    Python 编程中可以使用 PyMysql 进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接 MySQL 数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对 ...

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

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

  8. Python数据库连接池DBUtils

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

  9. python oracle连接池_python - DBUtils 连接池减少oracle数据库的连接数

    问题: 接到需求,告知项目的oracle连接次数过多,对系统造成太过大的负担,要求减少oracle数据库的连接次数 分析: 仔细分析代码以后,发现产生问题的原因,在于之前要求提升oracle监控的监控 ...

最新文章

  1. NET中的异步编程(二)- 传统的异步编程
  2. 前端实现数字快速递增_艾默生新型超声波发生器的数字控制功能可实现快速设置和准确操作...
  3. Ubuntu 12.04安装英汉词典
  4. 【渝粤题库】广东开放大学 社交礼仪 形成性考核
  5. Qt5.7+Opencv2.4.9人脸识别(六)Tcp,Mysql,3DES,XML综合
  6. TensorFlow第十步CNN BP 编程求解
  7. 4.2.#{}和${}的用法
  8. resultmap的写法_Mybatis的ResultMap的使用
  9. HDU1320 ZOJ1201 Inversion【水题】
  10. java写培根披萨和海鲜披萨_java子类继承父类实例-披萨的选择实现代码
  11. 富士通推出区块链技术驱动的数据存储系统(GBCAX)
  12. Java教程:如何使用Jib插件容器化SpringBoot应用?
  13. 信号检测与估计理论 pdf_目标检测的性能上界讨论
  14. RL(Chapter 3): Finite Markov Decision Processes (有限马尔可夫决策过程)
  15. 编程逻辑入门必备2:归纳推理
  16. 二维数组横向和纵向遍历的巨大差距:缺页问题
  17. 中国石油大学《输气管道设计与管理(含课程设计)》第二阶段在线作业
  18. 腾讯云服务器系统盘空间不足问题
  19. Android NV21与Bitmap相互转换 可实时添加水印
  20. 上海出租车电话一览表

热门文章

  1. Python之数据分析(星期均值、星期汇总、Numpy的take与where方法、apply_along_axis函数)
  2. Python之网络爬虫(selenium爬取动态网页、爬虫案例分析、哈希算法与RSA加密)
  3. 初学者python笔记(类的继承与多态---详解)
  4. 全国计算机等级考试二级Python考试大纲预测和分析
  5. Python正则表达式子模式扩展语法与应用
  6. Python绘制渐变色三角形
  7. 5 批量更新多条记录_如何使用 F12 开发者工具自动批量删除新浪微博
  8. abaqus生成adams柔性体_1:ABAQUS有限元分析-ABAQUS软件介绍
  9. 纸板怎么切割光滑_现有的切割机如何选择呢?进来看看就清楚了
  10. sap中查询字段长度_SAP会计科目编码的层级说明