Как перехватить это предупреждающее сообщение, когда запрос блокируется? - PullRequest
5 голосов
/ 23 сентября 2011

Когда я делаю запрос с помощью isql, я получаю следующее сообщение и блоки запросов.

Журнал транзакций в базе данных foo почти заполнен. Ваша транзакция приостанавливается до тех пор, пока в журнале не освободится место.

Когда я делаю то же самое с Python:

cursor.execute(sql)

Запрос блокируется, но я бы хотел увидеть это сообщение.

Я пытался:

Sybase.set_debug(sys.stderr)
connection.debug = 1

Я использую:

  • python-sybase-0.40pre1
  • Adaptive Server Enterprise / 15,5 / EBF 18164

РЕДАКТИРОВАТЬ: Вопрос: «Как мне записать это предупреждение в программе Python?»

Ответы [ 3 ]

1 голос
/ 09 ноября 2011

Хороший вопрос, и я не уверен, что смогу полностью ответить на него.Вот несколько идей.

Sybase.py использует протоколирование.Убедитесь, что вы используете его.Чтобы «поднять» выход из системы, я бы сделал это:

import logging
logging.basicConfig(level = logging.INFO,
                    format = "%(asctime)s %(levelname)s [%(filename)s] (%(name)s) %(message)s",
                    datefmt = "%H:%M:%S", stream = sys.stdout)
log = logging.getLogger('sybase')
log.setLevel(logging.DEBUG)

И, очевидно (почему я не нахожусь ??), чтобы это работало в Sybase.py, вам нужно установить глобальный DEBUG=True (см.строка 38)

Но тогда, если мы посмотрим на def execute, мы увидим (как вы указали), что оно блокируется.Мы ответим на ваш вопрос.Вы не получите ничего обратно, потому что это блокирует это.Итак, как это исправить - напишите неблокирующий извинительный метод;) В examples / timeout.py есть несколько советов.Очевидно, кто-то еще столкнулся с этим, но на самом деле не исправил это.

Я знаю, что это, вероятно, не помогло, но я потратил 15 минут на поиск - я должен, по крайней мере, рассказать вам, что я нашел .. Вы могли бы подумать, что execute даст вам немного result - Подождите, чтоэто значение результата в строке 707 ??

                while 1:
                    status, result = self._cmd.ct_results()
                    if status != CS_SUCCEED:
                        break

Если status! = CS_SUCCEED (который, как я полагаю, в вашем случае - True), можете ли вы просто увидеть, каков "результат"?Интересно, если они просто не смогли поднять результат как исключение?

0 голосов
/ 04 октября 2011

Ваш запрос может быть большим, что переполняет журнал транзакций (например, вы вставляете большие двоичные файлы). Или, возможно, вы не будете усекать журналы транзакций достаточно часто, если это возможно.

Во время выполнения вам может потребоваться оператор исключения, который перехватывает ошибку исключения.

См. Документацию Sybase Python .

0 голосов
/ 27 сентября 2011

Причина очевидна, журнал транзакций заполнен, вы можете проверить запросы blocikng в таблице sybase MDA monSysStatement .. здесь вы можете проверить оператор SQL, который принимает высокие значения Io, время, количество влияющих строк и т. Д.

...