在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
假设我处理异常,是否有办法通过在异常块中创建新的数据库连接来使事情回到正轨?
我的问题与Recover from dead database connection in Django类似,但不同,因为我使用的连接完全由框架管理。
当远程服务器/网络/防火墙丢弃空闲连接时,此问题仅发生 。
答案 0 :(得分:0)
通常作为开发人员,你不应该以这种方式接触Django的内部。
当Django在每个请求上建立连接时,它有机会同时建立连接并保持连接。
无论如何,连接都是正常的,所以你需要一种机制来为你提供数据库连接。
pool pattern确实是您所需要的,根据您的具体情况,有一些软件包可以为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的所有好处,但却是一种解决方法。