解决Python访问mysql数据库时候的“MySQL server has gone away”

今天进行cdn日志分析程序执行了近13个小时-_-!!不是我程序慢,实在是文件太大了17G的压缩文件,磁盘是sata盘,主机是2003年的DL320服务器。。。。。。
程序数据分析完毕后居然抛异常报错如下:
_mysql_exceptions.OperationalError      
(2006, 'MySQL server has gone away')
    <traceback object at 0x2aaaaad16d88>2010-07-12 22:43:40
检查mysql服务器设置发现,超时时间为8小时。但是我的程序执行了13个小时。。。。。。。杯具了。。。
mysql> show variables like '%wait_timeout%' ;
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 50    | 
| table_lock_wait_timeout  | 50    | 
| wait_timeout             | 28800 | 
+--------------------------+-------+
3 rows in set (0.00 sec)
唉,原来是程序与mysql建立链接后空闲时间太长,被mysql关闭掉了。

之前是程序一启动,打开与数据库的链接,每分析完一个产品的数据,将结果插入到数据库中。由于我的这个产品文件太多了,导致链接空闲时间太长,超过了最大超时时间。。。。。
修改了一下程序,当日志分析完毕后再打开与mysql数据库的链接,且当使用完毕后关闭链接。

### Django MySQL 'server has gone away' 错误解决方案 #### 修改 `settings.py` 中的数据库配置参数 为了防止长时间未使用的连接被MySQL服务器关闭,在Django项目的`settings.py`文件中可以调整`DATABASES`字典中的`CONN_MAX_AGE`选项,将其设为小于MySQL默认超时时间的一个值。例如,如果MySQL设定的最大非活动时间为8小时,则可将此参数设置为6小时[^2]。 ```python DATABASES = { 'default': { ... 'CONN_MAX_AGE': 21600, # 即6小时 ... } } ``` #### 使用中间件管理数据库连接 创建自定义中间件类用于捕获每次请求前后的情况,在请求开始前尝试重置持久化连接池内的所有链接对象;当响应返回给客户端之后再清理掉残留下来的无用连接实例。这种方法能够有效减少因网络波动等原因造成的异常断连现象发生概率[^3]。 ```python from django.db import close_old_connections class CloseConnectionMiddleware(object): def __init__(self, get_response): self.get_response = get_response def __call__(self,request): response = None try: close_old_connections() response = self.get_response(request) finally: if not connection.in_atomic_block and \ (not hasattr(response,'streaming') or getattr(response,'closed',False)): close_old_connections() return response ``` #### 手动刷新连接状态 对于某些特定场景下的操作(比如后台任务),可以在执行实际SQL语句之前先调用一次`close_old_connections()`函数手动释放旧有的失效链路并获取新的可用资源。这有助于避免由于长时间运行的任务而导致的会话过期问题[^4]。 ```python from django.db import connections, close_old_connections def do_my_work(): with transaction.atomic(): close_old_connections() cursor = connections['default'].cursor() cursor.execute('SELECT * FROM my_table') rows = cursor.fetchall() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值