我们使用Django来运行模型仿真。该代码以cronscript的形式运行(不通过wsgi),并注册是否成功运行了模拟。
在模型仿真开始时,将创建状态对象,其状态为RUNNING。在模型仿真结束时,此状态对象将更新为SUCCESS或FAILED。 (伪)代码如下所示:

def mainRoutine():
    myStatusObject = createStatusObject()
    try:
        runModelSimulation()  # this runs the modelsimulation
    except:
        updateStatus(myStatusObject,'FAILED')
    updateStatus(myStatusObject,'SUCCESS')

def createStatusObject():
    myStatusObject = models.StatusObject()
    myStatusObject.task = 'somename'
    myStatusObject.status = 'RUNNING'
    myStatusObject.save()
    return myStatusObject

def updateStatus(myStatusObject, newstatus):
    myStatusObject.status = newstatus
    myStatusObject.save()


当模型仿真花费很长时间时(从几小时到几天的仿真可能),问题就开始了。然后是与MySQL数据库的连接错误,错误为“ MySQL服务器已消失”。我从其他帖子中了解到,这与数据库剩余的某些连接有关(可以通过摆弄MySQL的服务器端配置来解决)。

目前,我通过传递statusobject(而不是statusobject实例)的ID找到了一种解决方法。然后,在updateStatus子例程中,我使用get(ID = thisID)在更新之前检索正确的statusObject实例。这不会产生超时。

def updateStatus(myStatusObjectID, newstatus):
    myStatusObject = StatusObject.objects.get(id=myStatusObjectID)
    myStatusObject.status = newstatus
    myStatusObject.save()


问题解决了?!但是,我们还有其他类似于statusobject的对象,并且可能会遇到模拟问题。因此,我想了解为什么此连接保持打开状态。传递StatusObject实例与传递与.get()组合的StatusObject ID之间有什么区别?在什么时候建立连接,如何防止该连接保持打开状态?我们能否告诉django在.save()之后关闭连接,并在实例的下一次更新时重新打开它。
同样,因为遍历StatusObject实例要比基于其搜索并根据其属性重新打开要容易。

最佳答案

在进行模型仿真之前,请关闭与MySQL的连接。 Django将在myStatusObject.save()调用中自动重新连接到sql服务器。

from django.db import connection

def mainRoutine():
    myStatusObject = createStatusObject()
    connection.close()
    try:
        runModelSimulation()  # this runs the modelsimulation
    except:
        updateStatus(myStatusObject,'FAILED')
    updateStatus(myStatusObject,'SUCCESS')

关于python - “MySQL服务器已消失”,流程历久不衰,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27942064/

10-12 23:10