Если я правильно понимаю ваш вопрос, мне кажется, вам нужно полагаться на свой сервер 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
Sys.time()
в основном потоке, за которым следуетtools::pskill()
, если это занимает слишком много времени. - person thc   schedule 07.07.2017