日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

解決ORA

 堂tj77m7tpne37 2018-11-21

在客戶端查詢數(shù)據(jù)的時候,有時候會出現(xiàn)明明有數(shù)據(jù),但是還是顯示查不到數(shù)據(jù),再點擊查詢或多查幾次又能查出來,很是郁悶,查看服務(wù)器日志,發(fā)現(xiàn)了如下錯誤:

  1. 2011-01-07 08:49:31,604 ERROR [STDERR] java.sql.SQLException: ORA-04068: existing state of packages has been discarded
  2. ORA-04061: existing state of package body 'ISGIS.GIS_DIST_STAT' has been invalidated
  3. ORA-04065: not executed, altered or dropped package body 'ISGIS.GIS_DIST_STAT'
  4. ORA-06508: PL/SQL: could not find program unit being called: 'ISGIS.GIS_DIST_STAT'
  5. ORA-06512: at 'ISGIS.VEHICLE_TEST_PROCCCCC', line 100
  6. ORA-06512: at line 1

錯誤的信息是說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異常的代碼:

  1. public static boolean returnExecutionRequired(SQLException e){
  2. boolean returnValue='72000'.equals(e.getSQLState()) && e.getErrorCode()==4068;
  3. return returnValue;
  4. }

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多