我们使用Django来运行模型模拟。代码作为cronscript(不是通过wsgi)运行,并记录模拟是否成功运行。 在modelsimulation开始时,会创建一个statusobject,其中status RUNNING处于运行状态。在modelsimulation结束时,此statusobject将更新为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()
当modelsimulation需要很长时间(可以模拟几个小时到几天)时,问题就开始了。然后是到MySQL数据库的连接错误,错误为“MySQL server已经消失”。我从其他帖子中了解到,这与数据库的某些连接有关(这可以通过摆弄MySQL的服务器端配置来解决)。你知道吗
目前我找到了一个解决方法,通过传递statusobject的ID,而不是statusobject实例。在updateStatus子例程中,我使用get(ID=thisID)在更新之前检索正确的statusObject实例。这不会产生超时。你知道吗
def updateStatus(myStatusObjectID, newstatus):
myStatusObject = StatusObject.objects.get(id=myStatusObjectID)
myStatusObject.status = newstatus
myStatusObject.save()
问题解决了?!但是,我们还有其他类似于statusobject的对象,可能会遇到类似的问题。所以我想了解为什么这个连接仍然是开放的。传递StatusObject实例和传递StatusObject ID与.get()的组合有什么区别?连接是在什么时候建立的,如何防止此连接保持打开状态?我们可以告诉django在.save()之后关闭连接,并在实例的下一次更新时重新打开它吗。 另外,因为传递StatusObject实例比根据其属性搜索并重新打开它更容易。你知道吗
在modelsimulation之前关闭到MySQL的连接。Django将在
myStatusObject.save()
调用时自动重新连接到sql server。你知道吗相关问题 更多 >
编程相关推荐