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

