欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

Flask之DButils

发布时间:2025/7/25 编程问答 74 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Flask之DButils 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一、简介

  在使用pymysql时遇到一些问题,就是当用户访问过多时,pymysql它同一时间只能处理一个线程。大大的降低了效率,对此我们基于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' )

使用数据库连接池:

def func():# 检测当前正在运行连接数的是否小于最大链接数,如果不小于则:等待或报raise TooManyConnections异常# 否则# 则优先去初始化时创建的链接中获取链接 SteadyDBConnection。# 然后将SteadyDBConnection对象封装到PooledDedicatedDBConnection中并返回。# 如果最开始创建的链接没有链接,则去创建一个SteadyDBConnection对象,再封装到PooledDedicatedDBConnection中并返回。# 一旦关闭链接后,连接就返回到连接池让后续线程继续使用。conn = POOL.connection()cursor = conn.cursor()cursor.execute('select * from tb1')result = cursor.fetchall()conn.close()

三、自制sqlhelper

代码:

class MySQLhelper(object):def __init__(self, host, port, dbuser, password, database):self.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=host,port=int(port),user=dbuser,password=password,database=database,charset='utf8')def create_conn_cursor(self):conn = self.pool.connection()cursor = conn.cursor(pymysql.cursors.DictCursor)return conn,cursordef fetch_all(self, sql, args):conn,cursor = self.create_conn_cursor()cursor.execute(sql,args)result = cursor.fetchall()cursor.close()conn.close()return resultdef insert_one(self,sql,args):conn,cursor = self.create_conn_cursor()res = cursor.execute(sql,args)conn.commit()print(res)conn.close()return resdef update(self,sql,args):conn,cursor = self.create_conn_cursor()res = cursor.execute(sql,args)conn.commit()print(res)conn.close()return ressqlhelper = MySQLhelper("127.0.0.1", 3306, "root", "1233121234567", "dragon")# sqlhelper.fetch_all("select * from user where id=%s",(1))# sqlhelper.insert_one("insert into user VALUES (%s,%s)",("jinwangba",4))# sqlhelper.update("update user SET name=%s WHERE id=%s",("yinwangba",1)) 好使不好使,试试就知道了

 原文链接:https://www.cnblogs.com/DragonFire/p/9498396.html

转载于:https://www.cnblogs.com/qq631243523/p/10268917.html

《新程序员》:云原生和全面数字化实践50位技术专家共同创作,文字、视频、音频交互阅读

总结

以上是生活随笔为你收集整理的Flask之DButils的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。