終於找到為什麼網頁程式連Oracle DB有時可以,但有時卻不行,原來是變數宣告的問題,為了方便,把連Oracle的程序用perl寫成function讓其他程式去require,這麼做是沒問題,但是把connection完的$dbh用my去宣告,再return出去給眾程式們使用,這麼做可就大大有問題囉!
在perl中,用my去宣告local variable,本是件立意良好的事,一般程式亦本該如此,經過my宣告過的變數只在該程式內使用與有效,一但程式結束就release該變數所佔的記憶體位址,這樣在一台繁忙的computing server內,較不容易出錯或產生資源不足的問題,因為每支程式都是獨立個體;但在網頁此等互動式程式,用local variable來儲存DB connection的資訊就不好囉~當user click網頁時,$dbh已經被DB connection function給傳出,而且因為程式已執行完成,所以$dbh的記憶體已經被釋放,此時若剛好有別的程式去用到相同位址,當然下個page連線就會失敗囉,用global variable來宣告就不會有這種問題,原來呀~之前都沒有注意到記憶體參照這塊,困擾我許久的問題,終於找到癥結,真是豁然開朗呀!
沒有留言:
張貼留言