Есть ли способ тайм-аута запроса MySql при использовании DBI и dbGetQuery?

я понимаю, что

dbGetQuery comes with a default implementation that calls dbSendQuery, then dbFetch, ensuring that the result is always freed by dbClearResult.

и

dbClearResult frees all resources (local and remote) associated with a result set. In some cases (e.g., very large result sets) this can be a critical step to avoid exhausting resources (memory, file descriptors, etc.)

Но моя команда только что столкнулась с заблокированной таблицей, которую мы вошли в MySQL для kill pid, и мне интересно - есть ли способ истечь время ожидания запроса, отправленного с использованием пакета DBI?

Я ищу и не могу найти эквивалент

dbGetQuery(conn = connection, 'select stuff from that_table', timeout = 90)

Я попробовал это и профилировал функцию с набором параметров и без него, и, похоже, он ничего не делает; с чего бы это, если dbClearResult всегда в игре?


person d8aninja    schedule 03.07.2017    source источник
comment
Здесь есть решение: stackoverflow.com/questions/7891073/ . Общая идея состоит в том, чтобы разветвить команду и использовать Sys.time() в основном потоке, за которым следует tools::pskill(), если это занимает слишком много времени.   -  person thc    schedule 07.07.2017
comment
Какой движок вы используете (MyISAM или InnoDB)? Ожидает ли коннектор весь набор результатов? Или он предоставляет данные постепенно? Этот выбор, если это возможно, имеет прямое влияние на ваш вопрос.   -  person Rick James    schedule 07.07.2017
comment
d8aninja помогла ли предоставленная информация решить вашу проблему? Я просто проверяю, правильно ли я понял ваш вопрос.   -  person Technophobe01    schedule 10.07.2017
comment
да вы сделали! @Технофоб01   -  person d8aninja    schedule 20.07.2017
comment
О, круто. Всегда рад помочь - просто проверяю. Заботиться.   -  person Technophobe01    schedule 20.07.2017


Ответы (1)


Если я правильно понимаю ваш вопрос, мне кажется, вам нужно полагаться на свой сервер MySQL для реализации требуемого тайм-аута запроса. Почему? dbQuery отправляет клиентский запрос на сервер, на котором вы хотите, чтобы сервер выполнил запрос и тайм-аут.

Предложенное решение:

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

Примечание. Возвращаемые данные запроса могут быть слишком большими для вас, но это другая проблема.

Пример MySql:

Подсказка MAX_EXECUTION_TIME разрешена только для операторов SELECT. Он накладывает ограничение N (значение времени ожидания в миллисекундах) на то, как долго оператору SQL разрешено выполняться до того, как сервер завершит его.


MAX_EXECUTION_TIME(N)

Пример с тайм-аутом в 1 секунду (1000 миллисекунд):

SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1 INNER JOIN t2 WHERE ...

Подсказка MAX_EXECUTION_TIME(N) устанавливает время ожидания выполнения оператора N миллисекунд. Если этот параметр отсутствует или N равно 0, применяется тайм-аут оператора, установленный системной переменной max_execution_time.

Подсказка MAX_EXECUTION_TIME применима следующим образом:

Для операторов с несколькими ключевыми словами SELECT, таких как объединения или операторы с подзапросами, MAX_EXECUTION_TIME применяется ко всему оператору и должен стоять после первого SELECT.

Он применяется к операторам SELECT только для чтения. Операторы, не предназначенные только для чтения, — это те, которые вызывают хранимую функцию, которая изменяет данные в качестве побочного эффекта.

Он не применяется к операторам SELECT в сохраненных программах и игнорируется.


Я надеюсь, что описанный выше подход поможет вам двигаться в правильном направлении.

person Technophobe01    schedule 09.07.2017