finally被置空導致資料庫連線掛死

2021-07-11 23:34:11 字數 1381 閱讀 4477

今天寫了幾行**,向資料庫插入一篇文章,程式執行表現很好,完全按照我的意願去走,可以寫入時都成功寫入資料庫,該失敗時果斷失敗。可是當我回頭再看**時,突然驚恐萬分。這裡面隱藏了多麼弱智的bug,甚至說是外行的錯誤,可是想了一下,似乎又很有可能出現,一不小心就有可能再次寫出來,所以寫個博警告下自己。

public int insertthreadbeanintodb(threadbean threadbean)

connection conn   = null;

preparedstatement  ps       = null;

int              result = 0;

try

}catch(exception e)finally

return errortype.geterrorcodebyerrortype("no_error");

}

在try裡面成功運算元據庫後,直接將結果返回;

catch到異常後直接返回錯誤碼;

在程式的最後直接返回成功。

嚴重沒睡醒!

無論是在在try裡面還是在catch裡面返回,都會講finally掛起,導致資料庫連線無法關閉。在上面的寫法下,如果出現錯誤,catch會攔截下來,所以出現錯誤的時候不會有任何不正常的表現,但是finally被置空了;而如果執行成功,則catch無效,可以在最後返回成功,程式也不會出現表面的失敗。而一旦try裡面的返回條件滿足,則try就會將finally置空,撇開上面的try裡面的情況,如果稍微處理複雜點,可能會出現,在操作成功的時候也會全部將finally置空,這時,finally將永遠得不到執行,所有資料庫連線將全部不能關閉。

這種錯誤在執行的時候不會出現任何異常表現,一旦時過境遷,這種錯誤將無從查起,而系統頻繁出現資料庫自然耗盡,解決辦法只有重啟...重啟...再重啟。當然了,也可以通過檢視資料庫連線的使用情況來分析問題的所在。但是問題已經公升級不止乙個檔次了,小疏忽引發的大問題,不可疏忽。

正確寫法:

public int insertthreadbeanintodb(threadbean threadbean)

connection  conn   = null;

preparedstatement  ps       = null;

int              result = 0;

try

}catch(exception e)finally

return operation_code;

}

如果非得在try-catch裡面返回,name至少應該寫在finally裡面,寫在關閉資料庫連線之後。

資料庫儲存資料導致被踢下線問題

問題 登入司機端後一段時間被踢下線 排查 經排查,是上傳司機聯絡歷史導致服務端返回token失效,上傳聯絡歷史的司機工號與當前司機登入的司機工號不符。除錯發現,資料庫中儲存的聯絡歷史列表對應的司機工號有多個 每次司機通話都會記錄通話 號碼以及司機工號等資訊到資料庫 原因可能有以下幾種 1 司機切換過...

sqlite資料庫被鎖住會導致相機預覽功能失效嗎

乙個專案在主介面activity執行有相機初始化 開啟相機視窗 及sqlite資料庫初始化操作,在與主介面與其他介面來回完成多次跳轉時候,主介面在執行完sqlit增加資料操作後 相機預覽功能異常 在仔細檢視 及logcat後 每次進入該介面後都做了資料庫初始化操作,在最後執行完資料庫查詢操作時丟擲s...

資料庫操作 獲取空資料

1 問題描述 資料庫查詢成功 oracledatareader reader command.executereader 在獲取資料 reader.getdouble 5 時 返回異常 system.invalidoperationexception 沒有資料可用於行或列。2 原因分析 查詢出的資料...