在客戶端查詢數(shù)據(jù)的時候,有時候會出現(xiàn)明明有數(shù)據(jù),但是還是顯示查不到數(shù)據(jù),再點擊查詢或多查幾次又能查出來,很是郁悶,查看服務(wù)器日志,發(fā)現(xiàn)了如下錯誤:
錯誤的信息是說ISGIS.GIS_DIST_STAT這個包的狀態(tài)是無效的,也就是說,DBServer重新編譯了這個包,導致出現(xiàn)此異常,如果在這個時候再查詢一次就不會報這個錯,原因是當包編譯的時候會將包的狀態(tài)緩存起來,當你重新編譯的時候,之前緩存的包的狀態(tài)變成了OLD,新編譯的變成了NEW,當程序來請求這個包的時候,加載的是OLD,而這個OLD已經(jīng)被標示成無效的了,所以報錯,當你再一次查詢的時候,程序已經(jīng)知道這個包是無效的,所以重新加載NEW,就不會再報錯,解決的方法大致有三個: 1。將所用到的包設(shè)置成無狀態(tài)的包,也就是說,不能在包里面設(shè)置全局變量,這樣,即使重新編譯了包,也不會出現(xiàn)以上錯誤,這需要在程序設(shè)計時就必須考慮到,但是很遺憾,我目前的程序在設(shè)計的時候沒有考慮這一點,包的規(guī)模比較大,全局變量到處都是! 2。將包中的全局變量拿出來放到一個新的包里,當前包不設(shè)置全局變量,當前包需要全局變量的時候到新包里去取,這樣,只要不重新編譯全局變量所在的包,就不會出現(xiàn)異常。我覺得這個方法比較好,因為要做到包里面沒有全局變量,不是要做很多重復的工作嗎?但是目前我這個程序中的全局變量到處都是,改起來太麻煩了,看來還是要在程序設(shè)計的時候考慮全面一點! 3。如果你的項目中用到了Spring框架,那你一定會知道Spring的環(huán)繞通知,所謂環(huán)繞通知,就是在方法執(zhí)行前和執(zhí)行后都會調(diào)用這個通知,在這個通知里,你可以改變傳入方法的參數(shù),也可以修改方法的返回值,當然還有前置通知和后置通知,不懂的朋友自己去查資料吧,我的打算是給需要調(diào)用包的方法都加上環(huán)繞通知,然后在方法執(zhí)行完判斷是否出現(xiàn)了4068異常,如果出現(xiàn)了此異常,就再去執(zhí)行一次,這樣就不會出現(xiàn)查不到數(shù)據(jù)的情況了,而且源代碼不需要改動,只要加配置文件和一個類就Ok,如果沒有用到spring那就自己想辦法吧,可以在執(zhí)行的時候判斷是否出現(xiàn)4068異常,然后再重新查詢,反正思路大致就是這樣,網(wǎng)上還有一種做法,我覺得也還不錯,就是將callableStatement,PreparedStatement,Statement這些類中的執(zhí)行數(shù)據(jù)庫操作的方法重寫,然后判斷有沒有出現(xiàn)4068異常,如果出現(xiàn),再執(zhí)行一次,這要求你在有可能出現(xiàn)4068異常的地方執(zhí)行數(shù)據(jù)庫操作都使用自己重寫過的類,如果項目龐大并且已經(jīng)成型,你會暈的,如果在項目搭建的時候就考慮到4068異常,這也未嘗不是一個好方法。 總結(jié): 綜上所述,個人覺得如果對數(shù)據(jù)庫更改方便的話,盡量使用第2種方法,如果數(shù)據(jù)庫不能隨便讓你動,而且程序已經(jīng)成型,不能去大范圍改動源代碼,那就使用Spring的環(huán)繞通知來做這個事情比較劃算! 嘿嘿,看來以后項目搭建的時候,如果數(shù)據(jù)庫用到包的話,那就要考慮考慮4068異常咯,因為等成型了再來改就比較麻煩了!我也是一菜鳥,希望高手看到不對的地方指正一下,謝謝! 附: java判斷數(shù)據(jù)庫4086異常的代碼:
|
|
來自: 堂tj77m7tpne37 > 《待分類》