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

Django批量运行测试时MySQL数据库连接异常求助

针对Django批量测试事务与MySQL连接错误的解决办法

1. 调大MySQL连接超时阈值

MySQL默认的wait_timeout和interactive_timeout可能偏短,批量跑测试时,空闲的连接会被服务器主动断开,触发2006错误。找到MySQL配置文件(通常是/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),添加或修改:

[mysqld]
wait_timeout = 3600
interactive_timeout = 3600

改完重启MySQL服务,再跑测试试试。

2. 关闭测试的事务包裹机制

Django默认用事务包裹每个测试,批量运行时容易出现事务嵌套或连接泄漏。可以全局或局部禁用:

  • 全局配置:在settings.py里修改测试运行器:
TEST_RUNNER = 'django.test.runner.DiscoverRunner'
TEST_NON_SERIALIZED_APPS = ['你的应用名']
  • 单个测试类:改用SimpleTestCase代替TestCase,它不会用事务包裹测试:
from django.test import SimpleTestCase

class YourTest(SimpleTestCase):
    # 测试代码
    pass

3. 检查新增测试的手动事务代码

新增的50个测试里,可能有手动操作事务但没清理干净的情况,比如开启事务后没回滚/提交,或者改了自动提交设置没恢复。一定要确保事务操作在finally块里收尾:

from django.db import transaction

def test_your_case(self):
    try:
        transaction.set_autocommit(False)
        # 你的测试逻辑
        transaction.commit()
    except Exception:
        transaction.rollback()
    finally:
        transaction.set_autocommit(True)  # 必须恢复默认设置

4. 给Django加数据库连接池

批量测试时连接频繁创建销毁容易出问题,用连接池可以复用连接。安装django-db-connection-pool,然后在settings.py里配置:

DATABASES = {
    'default': {
        'ENGINE': 'django_db_conn_pool.backends.mysql',
        'NAME': '你的数据库名',
        'USER': '用户名',
        'PASSWORD': '密码',
        'HOST': 'localhost',
        'PORT': '3306',
        'POOL_OPTIONS': {
            'POOL_SIZE': 20,
            'MAX_OVERFLOW': 10,
        }
    }
}

5. 拆分长耗时测试

如果新增测试里有跑很久的用例,会导致连接长时间空闲被MySQL断开。把这类测试拆成小测试,或者在测试过程中定期执行SELECT 1来保持连接活跃。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:30:59