You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python交易Bot代码随机停止更新MySQL数据库问题咨询

问题分析与解决方案

问题背景

为学习Python开发了类交易Bot应用,使用MySQL数据库,自定义BotDB类处理数据库操作,核心代码如下:

class BotDB: 
    def __init__(self, dbUsername, dbPassword): 
        print("Initializing database.") 
        self.__dbUsername = dbUsername 
        self.__dbPassword = dbPassword 
    # Function to connect to db. 
    def __connectToDatabase(self): 
        print("Connecting to database") 
        try: 
            self.__botDB = mysql.connector.connect( 
                host="localhost", 
                port=3306, 
                user=self.__dbUsername, 
                password=self.__dbPassword 
            ) 
            self.__botDBCursor = self.__botDB.cursor(buffered=True) 
            return True 
        except Exception as e: 
            print("Something went wrong in connecting to database.") 
            print(e) 
            return False

类内复用self.__botDBCursor和self.__botDB对象,频繁更新特定表时,运行一段时间后数据库随机停止更新且无报错,已确认执行了commit操作。


问题解答

1. 复用BotDB对象时,是否需要关闭并重新打开数据库连接?

需要定期检查连接有效性,必要时重新建立连接,原因如下:

  • MySQL服务器默认会断开长时间空闲的连接(wait_timeout默认8小时),如果Bot运行中存在长时间无数据库操作的情况,服务器端会主动关闭连接,但客户端的self.__botDB对象可能仍认为连接有效,后续操作会静默失败。
  • 长期复用单个连接可能积累隐性问题,比如游标未正确重置、事务残留,即使执行了commit,也可能导致后续操作无法正常执行。

建议做法:

  • 在每次数据库操作前,调用self.__botDB.ping(reconnect=True)自动检查并重连失效的连接。
  • 若Bot运行周期极长,可定期主动关闭旧连接并重新建立(比如每日一次)。

2. 更优的诊断或处理方案,包括ORM的使用?

诊断方案

  • 添加详细操作日志:在连接、SQL执行、commit等关键步骤前后记录时间戳、操作类型、SQL语句、影响行数,出现停止更新时可回溯定位问题节点。
  • 捕获全链路异常:当前仅在连接时捕获异常,需将所有数据库操作(执行SQL、commit等)包裹在try-except mysql.connector.Error块中,记录详细错误信息,避免异常静默。
  • 查看MySQL服务器日志:检查MySQL的error.log,确认是否存在连接断开、锁等待、超时等服务器端异常。

优化方案

  • 使用连接池:无论是原生mysql.connector.pooling还是ORM框架的连接池,都能自动管理连接的创建、复用与销毁,避免长期持有单个连接的风险。
  • 引入ORM框架:比如SQLAlchemy,它会自动处理连接生命周期、异常重连、事务管理,无需手动维护cursor和connection对象,大幅降低连接管理的复杂度。
  • 重构BotDB类:若暂不使用ORM,可添加连接检查机制:
def __ensure_connection(self):
    if not self.__botDB.is_connected():
        print("Reconnecting to database...")
        self.__connectToDatabase()
    # 或使用ping自动重连
    # self.__botDB.ping(reconnect=True)

在所有执行SQL的方法开头调用该函数,确保连接有效。


内容的提问来源于stack exchange,提问作者Sriram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:22:04