Sepertinya tidak ada yang setara
ke max_execution_time
di MySQL sebelum versi 5.7.4 dan 5.7.8 (pengaturan mengubah namanya). Yang dapat Anda lakukan adalah membuat pekerjaan berkala Anda sendiri yang memeriksa apakah kueri telah melampaui batas waktu dan mematikannya secara manual. Sayangnya itu tidak persis sama dengan apa yang dilakukan versi MySQL yang lebih baru:tanpa memeriksa info perintah, Anda akan berakhir dengan mematikan semua kueri, tidak hanya membaca SELECT
saja. , dan hampir tidak mungkin untuk mengontrol pada tingkat sesi.
Salah satu cara untuk melakukannya adalah dengan membuat prosedur tersimpan yang menanyakan daftar proses dan membunuh seperti yang dipersyaratkan. Prosedur tersimpan tersebut dapat terlihat seperti:
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 ;
Atau Anda bisa menerapkan semua itu dalam logika aplikasi Anda, tetapi itu akan membutuhkan perjalanan pulang pergi yang terpisah ke database untuk setiap kueri yang akan dimatikan. Yang tersisa adalah memanggil ini secara berkala:
# Somewhere suitable
engine.execute(text("CALL stmt_timeout_killer(:timeout)"), timeout=30)
Bagaimana dan di mana tepatnya sangat bergantung pada aplikasi Anda yang sebenarnya.