Изглежда, че няма еквивалент
до max_execution_time
в MySQL преди версии 5.7.4 и 5.7.8 (настройката промени името си). Това, което можете да направите, е да създадете свое собствено периодично задание, което проверява дали заявките са превишили времето за изчакване и ръчно да ги убива. За съжаление това не е съвсем същото като това, което правят по-новите версии на MySQL:без да проверявате информацията за командата, в крайна сметка ще убиете всички заявки, а не само четете SELECT
, и е почти невъзможно да се контролира на ниво сесия.
Един от начините да направите това е да създадете съхранена процедура който прави заявки за списъка с процеси и убива както се изисква. Такава съхранена процедура може да изглежда така:
DELIMITER //
CREATE PROCEDURE stmt_timeout_killer (timeout INT)
BEGIN
DECLARE query_id INT;
DECLARE done INT DEFAULT FALSE;
DECLARE curs CURSOR FOR
SELECT id
FROM information_schema.processlist
WHERE command = 'Query' AND time >= timeout;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- Ignore ER_NO_SUCH_THREAD, in case the query finished between
-- checking the process list and actually killing threads
DECLARE CONTINUE HANDLER FOR 1094 BEGIN END;
OPEN curs;
read_loop: LOOP
FETCH curs INTO query_id;
IF done THEN
LEAVE read_loop;
END IF;
-- Prevent suicide
IF query_id != CONNECTION_ID() THEN
KILL QUERY query_id;
END IF;
END LOOP;
CLOSE curs;
END//
DELIMITER ;
Като алтернатива можете да приложите всичко това в логиката на приложението си, но това ще изисква отделни кръгови пътувания до базата данни, за да бъде убита всяка заявка. Това, което остава, е периодично да извиквате това:
# Somewhere suitable
engine.execute(text("CALL stmt_timeout_killer(:timeout)"), timeout=30)
Как и къде точно зависи до голяма степен от действителното ви приложение.