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
相关产品推荐
相关产品推荐

