利用Python List实现简易MySQL连接池与故障恢复
本文介绍如何使用Python内置List结构构建最简化的MySQL连接池。通过预创建指定数量的数据库连接,并在主循环中定期检测连接状态,实现当MySQL服务重启或连接失效时自动剔除错误连接并重新建立新连接的功能。代码包含初始化、连接获取、异常处理及自动补全逻辑,适用于对性能要求不高但需保持连接可用性的场景。
连接池运行效果演示
首先展示一下运行效果。

故障检测与自动重连机制
在代码成功连接数据库并执行三条SQL语句后,手动重启MySQL服务。此时,连接池中的所有连接均变为不可用状态。为了恢复服务,程序会自动删除所有失效连接,并重新抓取新的连接。重启MySQL的具体命令如下所示。

Python连接池核心代码实现
接下来是Python代码的具体实现部分。
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import pymysql
import random
import time
# 初始化mysql 连接池
def MySQLInit(mysql_host,mysql_port,mysql_user,mysql_password,mysql_charset,mysql_dbname,mysql_maxconnect):
# 定义返回mysql连接池的类型,这里定义为 list
return_db_list = []
for Connect in range(0,mysql_maxconnect):
try:
db = pymysql.connect(
host = mysql_host ,
port = mysql_port ,
user = mysql_user ,
passwd = mysql_password ,
db = mysql_dbname ,
charset = mysql_charset
)
print ("连接MySQL数据库成功,MySQL数据库ID为:%s" %(db))
return_db_list.append(db)
except Exception as e:
print ("连接MySQL数据库出错")
print (e)
# 如果mysql连接池为空,则返回-1
if 0 == len(return_db_list):
print ("错误 , 连接MySQL数据库失败,连接池为0")
return -1
else:
# 返回mysql连接池
return return_db_list
def Pull_DB_Connect(mysql_host,mysql_port,mysql_user,mysql_password,mysql_charset,mysql_dbname , MySQL_Connect_Pool , mysql_maxconnect) :
# 打印补充前的mysql连接数
print ("补充前MySQL连接数为:",len(MySQL_Connect_Pool))
# 循环相差的连接数
for Connect in range((len(MySQL_Connect_Pool)) , mysql_maxconnect):
try:
db = pymysql.connect(
host = mysql_host ,
port = mysql_port ,
user = mysql_user ,
passwd = mysql_password ,
db = mysql_dbname ,
charset = mysql_charset
)
print ("重新补充,连接MySQL数据库成功,MySQL数据库ID为:%s" %(db))
# 将刚刚连接成功的DB连接追加到MySQL_Connect_Pool中
MySQL_Connect_Pool.append(db)
except Exception as e:
print ("重新补充,连接MySQL数据库出错")
print (e)
if 0 == len(MySQL_Connect_Pool):
print ("错误 , 连接MySQL数据库失败,连接池为0")
return -1
else:
# 打印连接池总数并且返回
print("Mysql 连接池总数为:" , len(MySQL_Connect_Pool))
return MySQL_Connect_Pool
def main() :
# 定义测试mysql信息
mysql_host = "192.168.1.100"
mysql_port = 3306
mysql_user = "liwang"
mysql_password = "liwang"
mysql_charset = "utf8"
mysql_dbname = "itchat"
mysql_maxconnect = 3
# 初始化mysql连接池
MySQL_Connect_Pool = MySQLInit(mysql_host,mysql_port,mysql_user,mysql_password,mysql_charset,mysql_dbname,mysql_maxconnect)
# 定义初始化sql
sql = "show databases;"
while True:
# 随机获连接池的下标
db_link = random.randint(0,len(MySQL_Connect_Pool)-1)
try:
# 执行sql
cursor = MySQL_Connect_Pool[db_link].cursor()
cursor.execute(sql)
print (cursor.fetchall())
except Exception as e:
# 如果执行失败,模拟为DB连接失效,则打印错误信息,删除错误的MySQL_Connect_Pool信息
print (e)
del MySQL_Connect_Pool[db_link]
print ("数据库无法连接,删除Mysql连接池下标:" , db_link)
# 重新补充mysql连接池
Pull_DB_Connect(mysql_host,mysql_port,mysql_user,mysql_password,mysql_charset,mysql_dbname,MySQL_Connect_Pool,mysql_maxconnect)
# 休眠10s
time.sleep(10)
if __name__ == "__main__" :
main()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









