我最近开始从一些旧代码中发现错误,似乎无法追溯问题.因为它以前是工作的,我想可能是软件更新 destruct 了什么.我正在使用Python2.7和django runfcgi以及nginx.这是我的原始代码:

views.py

DBNAME = "test"
DBIP = "localhost"
DBUSER = "django"
DBPASS = "password"
db = MySQLdb.connect(DBIP,DBUSER,DBPASS,DBNAME)
cursor = db.cursor()

def list(request):
    statement = "SELECT item from table where selected = 1"
    cursor.execute(statement)
    results = cursor.fetchall()

我试过以下几种方法,但还是不起作用:

views.py

class DB:
    conn = None
    DBNAME = "test"
    DBIP = "localhost"
    DBUSER = "django"
    DBPASS = "password"
def connect(self):
    self.conn = MySQLdb.connect(DBIP,DBUSER,DBPASS,DBNAME)
def cursor(self):
    try:
        return self.conn.cursor()
    except (AttributeError, MySQLdb.OperationalError):
        self.connect()
        return self.conn.cursor()

db = DB()
cursor = db.cursor()

def list(request):
    cursor = db.cursor()
    statement = "SELECT item from table where selected = 1"
    cursor.execute(statement)
    results = cursor.fetchall()

目前,我唯一的解决办法是在每个使用MySQL的函数中执行MySQLdb.connect()次.另外,我注意到在使用Django的manage.py runserver时,我不会有这个问题,而nginx会抛出这些错误.我怀疑我的连接是否超时,因为list()在服务器启动后的几秒钟内就被调用了.我正在使用的软件是否有任何更新会导致此中断/是否有修复此问题的方法?

编辑:我意识到我最近编写了一个中间件来守护一个函数,这就是问题的原因.不过,我想不出原因.这是中间件的代码

def process_request_handler(sender, **kwargs):
    t = threading.Thread(target=dispatch.execute,
        args=[kwargs['nodes'],kwargs['callback']],
        kwargs={})
    t.setDaemon(True)
    t.start()
    return
process_request.connect(process_request_handler)

推荐答案

根据MySQL documentation,当客户端无法向服务器发送问题时,会引发错误消息,很可能是因为服务器本身关闭了连接.在最常见的情况下,服务器将在(默认)8小时后关闭空闲连接.这在服务器端是可配置的.

MySQL documentation个列出了一些其他可能的原因,这些原因可能值得研究一下,看看它们是否适合您的情况.

除了在每个函数中调用connect()(最终可能会不必要地创建新连接),另一种方法是在Connection对象上使用ping()方法进行调查;这将使用try 自动重新连接的选项来测试连接.我努力在网上为ping()法找到大约decent documentation个,但this question的答案可能会有帮助.

注意,自动重新连接在处理事务时可能很危险,因为重新连接似乎会导致隐式回滚(这似乎是自动重新连接不是MySQLdb实现功能的主要原因).

Django相关问答推荐

Django ORM ForeignKey查询使用注释设置输出

Django:作为模型中的列表元素的字段

如何在Django CMS中更新上下文

通过从不同模型中提取值来在基于 django 类的视图中传递变量

从多个数据库访问 Django 会话

错误404除主要应用程序外,HTML页面无法渲染的其他应用程序

一次请求中更新整个Django模型

DecimalField 验证错误,返回不正确的值 Django

基于模型多选字段在模板django中显示结果

Nginx 响应 404 not found on Django media URL in preprod, dev ok

在 Django 中处理信用卡付款的最佳 Select 是什么?

Django:如何在表单 clean() 方法的 django 验证错误中添加 超链接?

django 创建多种类型用户的最佳方法

将 **kwargs 传递给 Django 表单

Django error:不能分配必须是实例

django - pisa:将图像添加到 PDF 输出

Django:在管理界面中显示图像

如何创建一个在复选框右侧显示复选框标签的 Django 表单?

Django表单集:首先需要?

import_module 的 Django 1.9 ImportError