在Django中,如何使代码从已死的数据库连接中恢复?这是一种情况:
# requests enters view handler
# executes code which does some synchronous tasks without any database interaction for 15min.
# first database activity in this request after 15min.
try:
o, created = act_details.objects.get_or_create(id=1) # this line fails because of a dead database connection.
except Exception as e:
logger.error(e) # ORA-03114: not connected to ORACLE假设我处理异常,是否有一种方法可以通过在异常块中创建一个新的数据库连接来使事情回到正轨?
我的问题类似于从Django中的死数据库连接中恢复,但不一样,因为我使用的连接完全是框架管理的。
只有当远程服务器/网络/防火墙丢弃空闲连接时,才会发生此问题。
发布于 2015-05-04 07:09:49
通常,作为开发人员,您不应该以这种方式公开Django的内部。
当Django在每个请求上建立一个连接时,它就有机会连接池连接和持久连接。
无论如何,连接都会以偶数方式超时,因此您需要一种机制来为您提供数据库连接。
池型确实是您所需要的,根据您的情况,有一些包为Oracle:https://pypi.python.org/pypi/django-oraclepool提供了连接池。
不过,我还没试过告诉你它是否有效。
更新
另外,您可以访问基础数据库游标:
from django.db import connections
try:
o, created = act_details.objects.get_or_create(id=1) # this line fails because of a dead database connection.
except Exception as e:
logger.error(e) # ORA-03114: not connected to ORACLE
conn = connections['oracle']
if conn.connection is None: # Attempt to get it again
with connection.cursor() as c:
c.execute("SELECT * from act_details WHERE id = %s" % [self.id])这样,虽然你失去了Django ORM的所有好处,但这是一个解决办法。
https://stackoverflow.com/questions/30024004
复制相似问题