在Django中空闲数据库连接

时间:2015-05-04 06:40:21

标签: python django database cx-oracle

在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类似,但不同,因为我使用的连接完全由框架管理。

当远程服务器/网络/防火墙丢弃空闲连接时,此问题仅发生

1 个答案:

答案 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的所有好处,但却是一种解决方法。