Хорошо, я знаю, что это не так просто. У меня есть два соединения с базой данных, определенные в моем файле settings.py: default
и cache
. Я использую бэкенд DatabaseCache
от django.core.cache
. У меня определен маршрутизатор базы данных, поэтому я могу использовать отдельную базу данных/схему/таблицу для своих моделей и для кеша. Идеально!
Теперь иногда моя кеш-БД недоступна, и есть два случая:
Соединение с базой данных было установлено уже при сбое БД - это просто - я могу использовать этот рецепт: 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
Соединение с базой данных еще не было установлено, поэтому мне нужно обернуть
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, насколько мне известно, не поддерживает этот параметр.
oracle/base.py
не изменяет настройки соединения (он удаляет толькоuse_returning_into
на деле), как это делают другие серверные части, поэтому результатgrep
предсказуем, ноconnect_timeout
будет передано в качестве аргумента вDatabase.connect
. - person alko   schedule 04.11.2013