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

Django生产环境数据库内容更新无法实时显示问题求助

Django 5生产环境数据库更新后前端不实时显示问题排查方案

针对你在AWS上用Django5+MySQL+Apache+WSGI部署的应用,生产环境下数据库写入/更新后前端无法实时获取最新数据的问题,结合你已尝试的方案,给出以下针对性排查方向:

1. 检查Django数据库事务配置

  • 确认settings.py中数据库的自动提交设置是否开启:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            # 其他数据库配置...
            'OPTIONS': {
                'autocommit': True,  # 必须设置为True,确保写操作后立即提交事务
            },
        }
    }
    
  • 若开启了ATOMIC_REQUESTS(每个请求作为原子事务),建议暂时关闭测试:
    DATABASES['default']['ATOMIC_REQUESTS'] = False
    
    该配置会让单个请求内的所有操作处于同一事务中,其他请求的更新需等待当前事务结束才能被读取,可能导致“延迟更新”的假象。

2. 排查WSGI进程级数据缓存

  • 检查代码中是否存在模块级全局变量缓存查询结果的情况,例如:
    # 错误示例:进程启动时缓存数据,后续不会自动更新
    cached_items = MyModel.objects.all()
    
    def my_view(request):
        return render(request, 'index.html', {'items': cached_items})
    
    这类缓存会随WSGI进程启动而持久化,即使数据库更新,未重启的进程仍会返回旧数据。确保每个请求都重新执行数据库查询,而非复用全局变量。
  • 若Apache配置了多WSGI进程,重启Apache后需确认所有旧进程已被杀死(可通过ps aux | grep httpd检查),避免残留进程返回旧数据。

3. 检查MySQL查询缓存与隔离级别

  • 若使用MySQL 8.0以下版本,确认查询缓存是否关闭:
    执行MySQL命令:SHOW VARIABLES LIKE 'query_cache_type';
    若结果为ON,需在MySQL配置文件中关闭:
    [mysqld]
    query_cache_type = 0
    query_cache_size = 0
    
    (MySQL 8.0已移除查询缓存功能,可忽略此步)
  • 检查MySQL隔离级别,默认REPEATABLE READ可能导致同一事务内重复查询返回旧数据。若业务允许,可调整为READ COMMITTED:
    # settings.py中添加
    DATABASES['default']['OPTIONS']['isolation_level'] = 'read committed'
    

4. 排查Apache与AWS层面的缓存

  • 检查Apache是否启用了mod_cache模块:
    执行apache2ctl -M | grep cache,若返回cache_module或disk_cache_module,需注释掉配置中的缓存指令:
    # 注释掉类似配置
    # CacheEnable disk /
    # CacheRoot /var/cache/apache2/mod_cache_disk
    
  • 若使用AWS CloudFront作为CDN,检查缓存策略是否排除了动态页面:
    确保动态内容(如依赖数据库的页面)的缓存行为设置为不缓存,或配置Cache-Control响应头强制客户端/CDN不缓存。

5. 确认Django视图无隐性缓存

  • 再次检查视图是否遗漏了cache_page装饰器,类视图需确保正确设置缓存控制:
    from django.views.generic import DetailView
    
    class ItemDetailView(DetailView):
        model = MyModel
        
        def get_cache_control(self):
            # 强制禁用缓存
            return 'no-cache, no-store, must-revalidate, max-age=0'
    
  • 确保模板中没有硬编码旧数据,或使用了模板缓存标签(如{% cache %})而未更新缓存键。

内容的提问来源于stack exchange,提问作者Esraa Abdelmaksoud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:52:48