2015-05-04 2 views
1

В Django, Как мне восстановить код из подключенного к базе данных соединения? Это сценарий:Простые соединения с базой данных в 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

Эй, этот связанный вопрос был моим :-) Независимо от причины, по которой вы получаете ошибку ORA-03114, не можете ли вы использовать трюк 'connection.close(), чтобы заставить Django повторно установить' Экземпляр django.db.connection? –

ответ

0

Обычно, как разработчик, вы не должны подвергаться внутренним воздействиям Django таким образом.

Поскольку Django устанавливает соединение по каждому запросу, у него есть возможность как подключить соединения, так и продолжить соединение.

Соединения тайм-аут в любом случае, так что вам нужен механизм для предоставления вам соединений с базой данных.

pool pattern действительно то, что вам нужно, и в зависимости от ситуации, есть некоторые пакеты, которые предлагают подключение пулы для Oracle: https://pypi.python.org/pypi/django-oraclepool

Я не пробовал, что сказать вам, если это работает, хотя.

UPDATE

Alternativelly вы можете получить доступ к основной базе данных курсора:

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, но его обходной путь.

+0

Я согласен с этим, но я действительно хочу понять, как быстро решить эту проблему, прежде чем использовать библиотеку для нее. – sbose

Смежные вопросы