Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:如何获得到数据库的新连接_Python_Mysql_Django - Fatal编程技术网

Python Django:如何获得到数据库的新连接

Python Django:如何获得到数据库的新连接,python,mysql,django,Python,Mysql,Django,我用django构建了一个web服务器 并使用线程运行任务,该任务将从客户端发送的数据保存到数据库 该线程是长时间运行的,但由于mysql服务器在8小时超时后断开连接,因此它将在很长时间后出现InterfaceError 尤其是它不能自动重新连接到数据库。创建一个新线程是可以的,但是它会增加资源占用 所以我想在同一线程中连接关闭时重新连接db。此外,Django每个请求都会获得一个新的连接 如何在同一线程中获得与数据库的新连接? 谢谢你 只需关闭异常处理程序中的连接即可。下次应用程序尝试与数据库

我用django构建了一个web服务器

并使用线程运行任务,该任务将从客户端发送的数据保存到数据库

该线程是长时间运行的,但由于mysql服务器在8小时超时后断开连接,因此它将在很长时间后出现InterfaceError

尤其是它不能自动重新连接到数据库。创建一个新线程是可以的,但是它会增加资源占用

所以我想在同一线程中连接关闭时重新连接db。此外,Django每个请求都会获得一个新的连接

如何在同一线程中获得与数据库的新连接?
谢谢你

只需关闭异常处理程序中的连接即可。下次应用程序尝试与数据库通信时,应建立新连接:

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()

Django本身使用该函数在每个请求的开始和结束时关闭超过其生存期的任何连接。这将检测连接是否早于数据库设置中指定的
MAX\u AGE
,或者无法使用。如果您将
MAX_AGE
设置为低于数据库的超时,则决不能因为数据库超时而遇到
InterfaceError

from django.db import close_old_connections

while True:
    try:  
        ...
    finally:
        close_old_connections()

我没有设置CONN_MAX_AGE参数,因此默认值为0。我无法测试“close_old_connections()”是否正常,因为它花费了8个小时来排除InterfaceError。如果我调用“connection.connection.close()”来模拟“InterfaceError”,然后再调用“close_old_connections()”将除“django.db.utils.ProgrammingError:关闭连接”之外的其他内容。@Mix当然,在服务器端超时的连接与从客户端显式关闭的连接不同,它们会产生不同的错误。服务器超时应该由
close\u old\u connections()
处理。我可以调用
connection.connection.close()
来模拟“InterfaceError”。但这可能不同。如果我调用“connection.connection.close()”来模拟“InterfaceError”,然后调用
connection.close()
将重新激活连接。太棒了!它起作用了。我将mysql服务器的等待超时从8小时更改为3秒。它会像上面我的编辑那样重新连接。
from django.db import close_old_connections

while True:
    try:  
        ...
    finally:
        close_old_connections()