使用mysql時(shí),有時(shí)候會(huì)遇到一個(gè)非常頭疼的問題,就是當(dāng)你執(zhí)行完一個(gè)存儲(chǔ)過程后,占用的內(nèi)存并沒有及時(shí)釋放,導(dǎo)致內(nèi)存占用不斷增加,最終導(dǎo)致程序崩潰。
DELIMITER ;; CREATE PROCEDURE test_procedure() BEGIN DECLARE i INT DEFAULT 0; WHILE i< 10000000 DO SET i = i + 1; END WHILE; END;;
以上是一個(gè)簡單的示例存儲(chǔ)過程,里面做了一個(gè)簡單的循環(huán)操作,執(zhí)行完這個(gè)存儲(chǔ)過程后,我們可以通過查看mysql進(jìn)程的內(nèi)存占用情況來判斷是否有內(nèi)存泄漏的情況。
執(zhí)行以下命令來查看mysql進(jìn)程的內(nèi)存占用情況:
ps aux | grep mysqld
可以看到類似以下的結(jié)果:
root 2053 7.1 19.1 1024812 610860 pts/0 Sl 12:22 0:18 /usr/sbin/mysqld
其中的“610860”就是mysql進(jìn)程的內(nèi)存占用大小(以KB為單位),我們可以重復(fù)執(zhí)行這個(gè)存儲(chǔ)過程來驗(yàn)證內(nèi)存是否會(huì)一直占用。
事實(shí)證明,這個(gè)存儲(chǔ)過程確實(shí)會(huì)導(dǎo)致內(nèi)存泄漏,執(zhí)行完一次存儲(chǔ)過程后,內(nèi)存占用大小并沒有隨著存儲(chǔ)過程結(jié)束而下降,而是繼續(xù)增加。
那么這個(gè)問題該如何解決呢?其實(shí)只需要在存儲(chǔ)過程里加上一行語句即可:
DELIMITER ;; CREATE PROCEDURE test_procedure() BEGIN DECLARE i INT DEFAULT 0; WHILE i< 10000000 DO SET i = i + 1; END WHILE; SET i = NULL; --新增這一行 END;;
這一行語句設(shè)置了變量i為NULL,可以釋放變量占用的內(nèi)存,從而解決了內(nèi)存泄漏的問題。
綜上所述,mysql存儲(chǔ)過程確實(shí)存在內(nèi)存泄漏的問題,但只需要在存儲(chǔ)過程里添加一行語句即可解決,這也是開發(fā)過程中需要注意的一個(gè)問題。