【解决】python连接mysql数据库过段时间就会断开pymysql.err.OperationalError

问题:
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.com/A-dying-ape/demo/tree/master/mysql%E8%BF%9E%E6%8E%A5%E6%B1%A0

  • 12
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Python中,可以使用`close()`方法来断开数据库连接,然后再次使用`connect()`方法重新连接数据库。下面是一个示例代码: ```python import mysql.connector try: conn = mysql.connector.connect(database="cookbook", host="localhost", user="cbuser", password="password") print("Connected") # 在这里执行数据库操作 conn.close() print("Disconnected") # 在这里可以重新连接数据库 conn = mysql.connector.connect(database="cookbook", host="localhost", user="cbuser", password="password") print("Reconnected") except: print("Cannot connect to server") ``` 在这个示例中,我们首先使用`connect()`方法连接数据库,并执行一些数据库操作。然后使用`close()`方法断开数据库连接。最后,我们再次使用`connect()`方法重新连接数据库。 #### 引用[.reference_title] - *1* *3* [【MySQL 每日一技】使用 Python 连接、选择、断开数据库](https://blog.csdn.net/weixin_37780776/article/details/124287225)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Python入门笔记(第十期——再次连接数据库)](https://blog.csdn.net/kun12343/article/details/122683885)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值