问题:
1.python中的数据库连接没有长连接的概念,之前我就踩过这个坑:用最基础的连接方法连接mysql数据库,然后往数据库插入数据,过一会儿就报错了(错误的代码我忘了,后面有遇到场景再重现一下),大概的意思是数据库连接已断开。
2.python基础连接方式进行数据库连接及增删改查操作,每次连接mysql请求时,都是独立的去请求访问,比较浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。
解决办法:
问题1中如果不在意数据库性能的话最简单的就是简单预处理一下:
try:
self.crs.execute(sql语句)
except:
self.conn.ping()
self.crs = self.conn.cursor()
self.crs.execute(sql语句)
self.conn.commit()
在保证连接配置正确和sql语句正确的情况下,捕获到的异常就是数据库连接异常了,即数据库不是长连接的,一段时间后会断开连接,此时对异常就行处理就是重新连接数据库。
而个人觉得一劳永逸的方法就是自己写一个数据库连接池,上面的问题就可以全部解决了,而且还不需要对数据库的连接进行管理,达到资源合理利用,有效提高数据库效益,真的非常高可用!
数据库连接池用到的模块是DBUtils。
pip3 install DBUtils
DBUtils提供两种外部接口:
PersistentDB:提供线程专用的数据库连接,并自动管理连接。
PooledDB:提供线程间可共享的数据库连接,并自动管理连接。
我用到的是PooledDB如下:
import pymysql
from DBUtils.PooledDB import PooledDB
mysqlInfo = {
"host": '主机IP',
"user": '用户',
"passwd": '密码',
"db": '数据库',
"port": 端口,
"charset": '编码'
}
class ConnMysql(object):
__pool = None
def __init__(self):
# 构造函数,创建数据库连接、游标
self.coon = ConnMysql.getmysqlconn()
self.cur = self.coon.cursor(cursor=pymysql.cursors.DictCursor)
# 数据库连接池连接
@staticmethod
def getmysqlconn():
global __pool
if ConnMysql.__pool is None:
__pool = PooledDB(
creator=pymysql,
mincached=2,
maxcached=5,
maxconnections=6,
maxshared=3,
blocking=True,
maxusage=None,
setsession=[],
ping=0,
host=mysqlInfo['host'],
user=mysqlInfo['user'],
passwd=mysqlInfo['passwd'],
db=mysqlInfo['db'],
port=mysqlInfo['port'],
charset=mysqlInfo['charset'])
return __pool.connection()
# 插入、修改、删除一条
def sql_change_msg(self, sql):
change_sql = self.cur.execute(sql)
self.coon.commit()
return change_sql
# 查询一条
def sql_select_one(self, sql):
self.cur.execute(sql)
select_res = self.cur.fetchone()
return select_res
# 查询多条
def sql_select_many(self, sql, count=None):
print(self.coon)
self.cur.execute(sql)
if count is None:
select_res = self.cur.fetchall()
else:
select_res = self.cur.fetchmany(count)
return select_res
# 释放资源
def release(self):
self.coon.close()
self.cur.close()
源码连接:
https://github/A-dying-ape/demo/tree/master/mysql%E8%BF%9E%E6%8E%A5%E6%B1%A0
更多推荐
【解决】python连接mysql数据库过段时间就会断开pymysql.err.OperationalError
发布评论