我已经使用django构建了一个Web服务器。
使用线程运行任务,将客户端发送的数据保存到数据库中。
while True: ... try: self.dbTarget, created = ClientMonitor.objects.get_or_create(Machine_code=own_MachC) data = self.workQueue.get() #from client sent self.dbTarget.setValue(data) #Custom method assigning self.dbTarget.save() #django ORM except InterfaceError as ee: pass
该线程长时间运行,但是很长一段时间后它将除了InterfaceError,因为mysql服务器断开连接为8小时超时。
特别是它无法自动重新连接到数据库。创建一个新线程就可以,但它会增加资源占用。
所以我想在同一个线程中关闭连接时重新连接db。 Django每个请求都有一个新的连接。
如何在同一个线程中获得与数据库的全新连接? 谢谢!!!
答案 0 :(得分:1)
只需关闭异常处理程序中的连接即可。下次应用程序尝试与数据库通信时,应建立新连接:
import logging
from django.db import connection
try:
self.dbTarget, created = ClientMonitor.objects.get_or_create(Machine_code=own_MachC)
...
except InterfaceError as ee:
logging.warning(ee) # make sure that you log these events
connection.close()
答案 1 :(得分:0)
Django本身使用函数close_old_connections()
来关闭每个请求开始和结束时超过其生命周期的任何连接。这将检测连接是否早于数据库设置中指定的MAX_AGE
,否则无法使用。如果将MAX_AGE
设置为低于数据库的超时,则由于db超时,您永远不会遇到InterfaceError
。
from django.db import close_old_connections
while True:
try:
...
finally:
close_old_connections()