写在前面
之前,给大家分享过一个我自己写的实用模块:《python操作mysql数据库的精美实用模块》
这个模块,我自己也一直在用的,没出过什么BUG。但其实,这个代码,也一直存在着一个不太优雅的问题——
就是对数据库进行了频繁地创建连接和销毁连接,这减慢了操作时间,也消耗了服务器内存。
最近,看到了 数据库连接池技术,其实这个技术理解起来也很简单,所以果断对自己的代码了进行升级。
当然,之前的《python操作mysql数据库的精美实用模块》也并非完全无用武之地了,就像我手上其中一个项目,因为之前整体构架的问题,偏偏就用不上数据库连接池技术,上了反而会出问题。
凡事都有利有弊,大家都需要根据自己项目的情况,对应选择运用合适自己项目的技术。
数据库连接池技术
好了,正式介绍下这个技术:
连接池是一种常见的数据库优化技术,它可以减少数据库连接的开销,提高程序性能。
连接池的基本思想是在程序启动时,创建一定数量的数据库连接,并保存在一个容器中。
当程序需要访问数据库时,从容器中获取一个空闲的连接,使用完毕后,将连接归还到容器中,而不是关闭连接。
DBUtils 库
DBUtils 是一个常用的 Python 的第三方数据库连接池库,支持多种数据库,包括 MySQL、PostgreSQL、SQLite 等。
网上相关资料,也是比较丰富的,如需详细了解,大家自行搜索资料吧。
这里按照我的风格惯例,给大家直接上我自己写好的实用模块,方便拿走即用。
其中,我的初代版《python操作mysql数据库的精美实用模块》也已经改为类实现了,这次一起奉上。
python操作mysql数据库的精美实用模块—— DBUtils连接池版
import pymysql
from dbutils.pooled_db import PooledDB
#############################################################################################
# 连接mysql数据库-----使用数据库连接池技术----dbutils库
#############################################################################################
db_pool = PooledDB(
creator=pymysql, # 使用链接数据库的模块
maxconnections=800, # 连接池允许的最大连接数,0和None表示不限制连接数
mincached=8, # 初始化时,链接池中至少创建的空闲的链接,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 = always
host='127.0.0.1',
port=3306,
user='root'
password='root',
database='mydbdemo',
charset='utf8'
)
class DBManager():
# 创建数据库连接
def __init__(self):
self.db = db_pool.connection()
# 关闭数据库连接
def closeDB(self):
self.db.close()
#连接数据库,执行插入SQl
def executeQueryID(self,sqlstring):
try:
cursor = self.db.cursor()
cursor.execute(sqlstring)
self.db.commit()
the_id = int(cursor.lastrowid)
#the_id = int(db.insert_id())
return the_id
except Exception:
return False
finally:
self.db.close() # 关闭数据库连接
# 连接数据库,执行SQl,无返回
def executeQueryNO(self, sqlstring):
try:
cursor = self.db.cursor()
cursor.execute(sqlstring)
self.db.commit()
return True
except Exception:
self.db.rollback()
return False
finally:
self.db.close() # 关闭数据库连接
#连接数据库,执行SQL,返回单条数据
def executeQueryone(self, sqlstring):
try:
cursor = self.db.cursor()
cursor.execute(sqlstring)
dataone = cursor.fetchone()
return dataone
except Exception:
return False
finally:
self.db.close() # 关闭数据库连接
#连接数据库,执行SQL,返回多条数据
def executeQueryall(self, sqlstring):
try:
cursor = self.db.cursor()
cursor.execute(sqlstring)
dataall = cursor.fetchall()
return dataall
except Exception:
return False
finally:
self.db.close() # 关闭数据库连接
python操作mysql数据库的精美实用模块—— 原版改用类实现
##############################################################################################
# 连接mysql数据库
#############################################################################################
class DBManager_Old():
# 创建数据库连接
def __init__(self):
db_config = ConfigManager.get_db_config()
self.db = pymysql.Connect(
host='127.0.0.1',
port=3306,
user='root',
passwd='root',
db='mydbdemo',
charset='utf8')
# 关闭数据库连接
def closeDB(self):
self.db.close()
#连接数据库,执行插入SQl
def executeQueryID(self,sqlstring):
try:
cursor = self.db.cursor()
cursor.execute(sqlstring)
self.db.commit()
the_id = int(cursor.lastrowid)
#the_id = int(db.insert_id())
return the_id
except Exception:
return False
finally:
self.db.close() # 关闭数据库连接
# 连接数据库,执行SQl,无返回
def executeQueryNO(self, sqlstring):
try:
cursor = self.db.cursor()
cursor.execute(sqlstring)
self.db.commit()
return True
except Exception:
self.db.rollback()
return False
finally:
self.db.close() # 关闭数据库连接
#连接数据库,执行SQL,返回单条数据
def executeQueryone(self, sqlstring):
try:
cursor = self.db.cursor()
cursor.execute(sqlstring)
dataone = cursor.fetchone()
return dataone
except Exception:
return False
finally:
self.db.close() # 关闭数据库连接
#连接数据库,执行SQL,返回多条数据
def executeQueryall(self, sqlstring):
try:
cursor = self.db.cursor()
cursor.execute(sqlstring)
dataall = cursor.fetchall()
return dataall
except Exception:
return False
finally:
self.db.close() # 关闭数据库连接
写在最后
所以,你看,大家平时学习或开发时,发现更好更合适的技术或方法,就要积极去升级自己项目的代码,这就是所谓的重构。
《程序员修炼之道》有言:尽早重构,经常重构。
重构的思想精髓,就是不断地去升级项目的代码,同时,这个过程也在不断地修炼自己的技术。
其实,代码需要重构,整个项目也需要重构,我们的能力也需要重构,我们的人生也需要重构。
重构,不是推倒重来,是在现有的基础上,一步一步,不断去升级,去变得更好。
这其实就是修炼啊,人生本就是一场修炼。
这就是我理解的重构。