最近weblogic用的起來老是數據庫連接池被耗盡

只要connection沒有被close就一定會發生connection leak。先前我對此也是篤信不疑。直到有一次我在作系統壓力測試時碰巧發現沒有close掉的connection居然沒發生leak,這讓我很吃驚。於是專門做了一個實驗來驗證沒有close的connection是否可以被GC回收。下面就把這個簡單的試驗說一下:

先寫一個很簡單的jsp,從pool中申請connection,把申請出的connection存放在jsp的局部變量中,用完後不關它。然後用類似LR壓力測試工具錄製一段簡單腳本,製造若干併發去訪問這個頁面,或者乾脆就使勁刷新這個jsp,然後觀察WLS connection pool的狀態,看看connection是不是一會就分配不出來了?答案是,connection pool沒發生leak,connection一直可以從pool中申請出來。

讓我們分析一下,爲什麼connection沒有發生leak。
當GC發現connection對象已經沒有被別的對象引用時,就把它當“垃圾”回收了。在connection被destroy掉的時候,應該是connection的finalize方法對connection是否close做了判斷,如果沒有close,那就close這個connection,於是pool回收了這個Connection。

由於不清楚WebLogic關於Connection pool的實現機制,上述connection回收過程的具體流程實屬臆測,但有一點可以肯定,connection確實是被pool回收了。

做完這個實驗很慚愧,慚愧的是把SUN和BEA想的太簡單了,其實BEA聰明的利用了看似很傻的GC實現了資源的回收,呵呵。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章