В Django, как я могу установить тайм-аут соединения с БД?

Хорошо, я знаю, что это не так просто. У меня есть два соединения с базой данных, определенные в моем файле settings.py: default и cache. Я использую бэкенд DatabaseCache от django.core.cache. У меня определен маршрутизатор базы данных, поэтому я могу использовать отдельную базу данных/схему/таблицу для своих моделей и для кеша. Идеально!

Теперь иногда моя кеш-БД недоступна, и есть два случая:

  1. Соединение с базой данных было установлено уже при сбое БД - это просто - я могу использовать этот рецепт: http://code.activestate.com/recipes/576780-timeout-for-nearly-any-callable/ и оберните мой запрос следующим образом:

    try:
        timelimited(TIMEOUT, self._meta.cache.get, cache_key))
    expect TimeLimitExprired:
        # live without cache
    
  2. Соединение с базой данных еще не было установлено, поэтому мне нужно обернуть timelimited часть кода, которая фактически устанавливает соединение с базой данных. Но я не знаю, где существует такой код и как его выборочно обернуть (т.е. обернуть только cache соединение, оставить default соединение без тайм-аута)

Вы знаете, как сделать пункт 2?

Обратите внимание, что этот ответ https://stackoverflow.com/a/1084571/940208 неверен:

grep -R "connect_timeout" /usr/local/lib/python2.7/dist-packages/django/db

не дает результатов, и драйвер cx_Oracle, насколько мне известно, не поддерживает этот параметр.


person mnowotka    schedule 04.11.2013    source источник
comment
Вы используете оракул в качестве базы данных?   -  person Thomas    schedule 04.11.2013
comment
@MattWritesCode - если вы не заметили, я включил эту ссылку в свой вопрос, заявив, что это совсем не правильно.   -  person mnowotka    schedule 04.11.2013
comment
Обратите внимание, что oracle/base.py не изменяет настройки соединения (он удаляет только use_returning_into на деле), как это делают другие серверные части, поэтому результат grep предсказуем, но connect_timeout будет передано в качестве аргумента в Database.connect.   -  person alko    schedule 04.11.2013
comment
@alko - да, я это знаю, но в документации cx_Oracle параметр timeout не упоминается (строго говоря, он есть в объекте пула, но в совсем другом значении). Философия Oracle заключается в том, чтобы установить тайм-аут на сервере, а не на стороне клиента, поэтому нет конфигурации клиента, которая может определить тайм-аут.   -  person mnowotka    schedule 04.11.2013