內(nèi)存泄漏 - 開(kāi)篇 數(shù)據(jù)庫(kù)應(yīng)用
最近都在讀那個(gè)該死的豬小弟寫的代碼,原因還不是因?yàn)閴毫y(cè)試后,發(fā)現(xiàn)TMD的內(nèi)存泄漏啦!
邊看代碼邊在心中鄙視這個(gè)豬小弟,該死的豬小弟,說(shuō)你比豬笨,豬覺(jué)得這是對(duì)自己的侮辱都不樂(lè)意,
很多心得哦,慢慢整理出來(lái)。
先說(shuō)說(shuō)JDBC吧。
不關(guān)閉Connection
邊看代碼邊在心中鄙視這個(gè)豬小弟,該死的豬小弟,說(shuō)你比豬笨,豬覺(jué)得這是對(duì)自己的侮辱都不樂(lè)意,
很多心得哦,慢慢整理出來(lái)。
先說(shuō)說(shuō)JDBC吧。
不關(guān)閉Connection
這是最常見(jiàn)的錯(cuò)誤,數(shù)據(jù)庫(kù)增刪改操作后,沒(méi)有關(guān)閉數(shù)據(jù)庫(kù)連接,導(dǎo)致占用大量?jī)?nèi)存,如果是用連接池,那么系統(tǒng)很快就木有可用的數(shù)據(jù)庫(kù)連接了;如果是直接連接數(shù)據(jù)庫(kù),很快系統(tǒng)內(nèi)存就耗盡了,要知道數(shù)據(jù)庫(kù)連接很費(fèi)資源的,否則要連接池干嗎?而且這種錯(cuò)誤很難查,一個(gè)系統(tǒng)上百個(gè)DB操作,就一個(gè)沒(méi)關(guān)閉,慘了!
不關(guān)閉Statement,ResultSet
不關(guān)閉Statement,ResultSet
這是另一種錯(cuò)誤,數(shù)據(jù)庫(kù)連接關(guān)閉了,但是Statement,ResultSet沒(méi)關(guān)閉。誰(shuí)說(shuō)的關(guān)閉了數(shù)據(jù)庫(kù)連接其它就不用關(guān)閉的。只關(guān)閉連接,那些Statement,ResultSet就如同孤墳野鬼一樣占據(jù)你的Heap,而且還是陰魂不散的說(shuō),最后系統(tǒng)耗盡內(nèi)存氣絕身亡。
頻繁數(shù)據(jù)庫(kù)連接
大多數(shù)業(yè)務(wù)系統(tǒng),一個(gè)業(yè)務(wù)操作可能會(huì)關(guān)聯(lián)多張表的增刪改。麻煩不要每操作一張表,就請(qǐng)求一次數(shù)據(jù)庫(kù)連接。麻煩把請(qǐng)求數(shù)據(jù)庫(kù)連接看做是請(qǐng)你學(xué)妹吃飯好不好,小學(xué)妹很矜持,請(qǐng)一次也不容易。這樣想,你請(qǐng)求數(shù)據(jù)庫(kù)連接時(shí),就會(huì)謹(jǐn)慎些,盡可能一次數(shù)據(jù)庫(kù)連接,對(duì)多張表進(jìn)行操作。
經(jīng)驗(yàn)
不要把代碼寫成connection.close(); 或者 datasource.getConnection();把他們都封裝到工具類里面,這樣測(cè)試的時(shí)候加進(jìn)去debug代碼,很容易就找到那個(gè)該死的連接沒(méi)有關(guān)閉了。Statement, ResultSet也是這樣。
最后,豬小弟是誰(shuí)?
呵呵,豬小弟是5年前的我,或者是8年前的我。當(dāng)年,年幼無(wú)知,無(wú)知者無(wú)畏,犯下無(wú)數(shù)的錯(cuò)誤,感謝老板,感謝客戶,你們太有犧牲精神了。
大多數(shù)業(yè)務(wù)系統(tǒng),一個(gè)業(yè)務(wù)操作可能會(huì)關(guān)聯(lián)多張表的增刪改。麻煩不要每操作一張表,就請(qǐng)求一次數(shù)據(jù)庫(kù)連接。麻煩把請(qǐng)求數(shù)據(jù)庫(kù)連接看做是請(qǐng)你學(xué)妹吃飯好不好,小學(xué)妹很矜持,請(qǐng)一次也不容易。這樣想,你請(qǐng)求數(shù)據(jù)庫(kù)連接時(shí),就會(huì)謹(jǐn)慎些,盡可能一次數(shù)據(jù)庫(kù)連接,對(duì)多張表進(jìn)行操作。
經(jīng)驗(yàn)
不要把代碼寫成connection.close(); 或者 datasource.getConnection();把他們都封裝到工具類里面,這樣測(cè)試的時(shí)候加進(jìn)去debug代碼,很容易就找到那個(gè)該死的連接沒(méi)有關(guān)閉了。Statement, ResultSet也是這樣。
最后,豬小弟是誰(shuí)?
呵呵,豬小弟是5年前的我,或者是8年前的我。當(dāng)年,年幼無(wú)知,無(wú)知者無(wú)畏,犯下無(wú)數(shù)的錯(cuò)誤,感謝老板,感謝客戶,你們太有犧牲精神了。
posted on 2013-01-18 11:14 amenglai 閱讀(271) 評(píng)論(0) 編輯 收藏 所屬分類: 我愛(ài)內(nèi)存泄露