Heroku Python应用用mysql.connector连接ClearDb时遇连接丢失问题
解决Heroku上mysql.connector连接ClearDb执行查询时断开的问题
问题分析
你遇到的OperationalError: 2013 (HY000): Lost connection to MySQL server during query错误,主要由以下原因导致:
- ClearDb存在连接闲置超时机制,长连接长时间无操作会被主动断开
- 你注意到的
?reconnect=true是JDBC风格参数,mysql.connector不识别,需使用库自带的自动重连配置 - 直接拼接SQL字符串存在语法风险(比如用户名含特殊字符),可能导致查询中断进而触发连接异常
解决方案
1. 配置自动重连与连接池
修改连接代码,添加mysql.connector支持的自动重连参数和连接池,避免闲置连接被断开:
db_config = { "host": "clearDbHost", "user": "123qwe", "password": "123qwe", "database": "heroku_4fsdfsdf30daf8", "port": 3306, "autocommit": True, "autoreconnect": True, # 开启自动重连 "connection_timeout": 30, # 设置连接超时时间 "pool_name": "cleardb_pool", "pool_size": 5 # 适配ClearDb的连接限制 } conn = mysql.connector.connect(**db_config)
2. 执行查询前检查连接状态
即使开启自动重连,也可手动检查连接有效性,确保执行查询时连接正常:
def ensure_connection(conn): if not conn.is_connected(): conn.reconnect(attempts=3, delay=2) # 最多重连3次,每次间隔2秒 return conn # 执行查询前调用 conn = ensure_connection(conn) curs = conn.cursor()
3. 用参数化查询替代字符串拼接
直接拼接SQL会导致语法错误和SQL注入风险,改用参数化查询:
# 错误写法(存在风险) # curs.execute("INSERT INTO users (username, follow_id) VALUES ('" + user.username + "', '" + user.id + "')") # 正确的参数化写法 query = "INSERT INTO users (username, follow_id) VALUES (%s, %s)" curs.execute(query, (user.username, user.id))
这种方式会自动处理特殊字符,避免因语法错误导致的连接中断。
4. 合理管理游标与连接
用完游标后及时关闭,避免资源泄漏;也可以用上下文管理器自动管理:
# 手动管理 curs.execute(query, (user.username, user.id)) curs.close() # 关闭游标 # 上下文管理器(推荐) with mysql.connector.connect(**db_config) as conn: with conn.cursor() as curs: curs.execute(query, (user.username, user.id))
上下文管理器会自动关闭游标和连接,避免闲置连接被ClearDb回收。
内容的提问来源于stack exchange,提问作者Mike Hadzhiev
相关产品推荐
相关产品推荐

