Het lijkt erop dat er geen equivalent is
naar max_execution_time
in MySQL vóór versies 5.7.4 en 5.7.8 (de instelling veranderde van naam). Wat u kunt doen, is uw eigen periodieke taak maken die controleert of query's de time-out hebben overschreden en deze handmatig beëindigen. Helaas is dat niet helemaal hetzelfde als wat de nieuwere MySQL-versies doen:zonder de opdrachtinformatie te inspecteren, doodt u uiteindelijk alle zoekopdrachten, niet alleen alleen lezen SELECT
, en het is bijna onmogelijk om te controleren op sessieniveau.
Een manier om dat te doen is door een opgeslagen procedure
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 ;
Als alternatief zou je dat allemaal in je applicatielogica kunnen implementeren, maar het zou afzonderlijke retourvluchten naar de database vereisen voor elke query die moet worden afgebroken. Wat overblijft is om dit periodiek te noemen:
# Somewhere suitable
engine.execute(text("CALL stmt_timeout_killer(:timeout)"), timeout=30)
Hoe en waar precies hangt sterk af van uw daadwerkelijke toepassing.