mashiguang

          小馬快跑

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            20 隨筆 :: 0 文章 :: 60 評(píng)論 :: 0 Trackbacks
           

          最近公司客戶反映有些頁(yè)面運(yùn)行速度太慢,通過(guò)對(duì)系統(tǒng)代碼的分析,發(fā)現(xiàn)排行榜功能是罪魁禍?zhǔn)祝驗(yàn)閿?shù)據(jù)量太大,每次刷新頁(yè)面都計(jì)算一次排行榜,的確耗時(shí)費(fèi)力。

          其實(shí)可以讓數(shù)據(jù)庫(kù)自己計(jì)算排行榜,并把計(jì)算結(jié)果保存到一個(gè)單獨(dú)的表里去,這個(gè)表只用來(lái)保存排行榜的數(shù)據(jù),數(shù)據(jù)量很小,然后所有的排行榜查詢都去select這個(gè)表。

          計(jì)算排行榜的功能我們可以寫成一個(gè)存儲(chǔ)過(guò)程,但是排行榜的數(shù)據(jù)不是一成不變的,還需要不時(shí)的調(diào)用這個(gè)存儲(chǔ)過(guò)程才行,oracle為我們提供了dbms_jobs

          oracel dbms_jobs包可以提交作業(yè)到作業(yè)隊(duì)列中,這個(gè)包中還提供其它一些函數(shù)管理以前提交的作業(yè),如對(duì)作業(yè)進(jìn)行修改、禁止或刪除等操作。

          常用函數(shù):

          submit(),提交作業(yè)到作業(yè)隊(duì)列。

          isumbit()

          remove(),從作業(yè)隊(duì)列中刪除作業(yè)。

          change(),改變已有作業(yè)的參數(shù)。

          what(),改變作業(yè)要執(zhí)行的代碼。

          next_date(),改變作業(yè)下一次執(zhí)行時(shí)間。

          interval(),改變作業(yè)執(zhí)行的時(shí)間間隔。

          broken(),暫停執(zhí)行作業(yè)。

          run(),強(qiáng)制執(zhí)行作業(yè)。

          最常用的submit()函數(shù):

          dbms_jobs.submit(

                 job out binary_integer,

                 what in varchar2,

                 next_date in date default sysdate,

                 interval in varchar default null,

                 no_parse in boolean default false,

                 instance in binary_integer default any_instance,

                 force in boolean default false

          );

          submit函數(shù)參數(shù):

          job,作業(yè)的作業(yè)號(hào),是個(gè)輸出參數(shù),所以調(diào)用submit函數(shù)時(shí),這個(gè)參數(shù)要指定一個(gè)已存在的變量。

          what,作業(yè)要執(zhí)行的代碼,一般是存儲(chǔ)過(guò)程。

          next_date,下一次作業(yè)運(yùn)行的日期。

          interval作業(yè)執(zhí)行的間隔時(shí)間,這個(gè)參數(shù)默認(rèn)值是null也就是what指定的代碼只在next_date這一時(shí)間執(zhí)行一次。

          no_parse,默認(rèn)值是false,當(dāng)參數(shù)值是false,提交作業(yè)時(shí)就對(duì)what指定的代碼進(jìn)行語(yǔ)法分析;當(dāng)參數(shù)值是true,第一次運(yùn)行what指定代碼時(shí)才進(jìn)行語(yǔ)法分析。

          instance,指明運(yùn)行作業(yè)的數(shù)據(jù)庫(kù)實(shí)例。

          force,如果是true,instance可以是任何正數(shù);如果是falseinstance指定的實(shí)例必須正在運(yùn)行。

          示例:

          var jobno number;

          begin

          dbms_job.submit(:jobno,'p_xxx_taxis;',trunc(sysdate)+(18/24),'trunc(sysdate+1,''hh'')');--每天18點(diǎn)執(zhí)行

          commit;

          end;

          上面這段話要在 命令窗口 下運(yùn)行,如在pl/sql developer里面的-->新鍵-->命令窗口

          這樣就會(huì)在每天的18點(diǎn)執(zhí)行存儲(chǔ)過(guò)程p_xxx_taxis。在我這里p_xxx_taxis執(zhí)行的是計(jì)算排行榜的任務(wù)。

          posted on 2008-07-14 16:56 mashiguang 閱讀(4135) 評(píng)論(6)  編輯  收藏

          評(píng)論

          # re: oracel dbms_jobs的使用 2008-07-14 18:19 bt
          java的效率本來(lái)就不好,數(shù)據(jù)量大一點(diǎn)就不行了。呵呵。  回復(fù)  更多評(píng)論
            

          # re: oracel dbms_jobs的使用 2008-07-15 13:30 lan
          排行榜之類的東西,本身就不應(yīng)當(dāng)是實(shí)時(shí)的,本身就不是頁(yè)面去做的。
          應(yīng)當(dāng)每隔一段時(shí)間在后臺(tái)作一次,葉面僅僅是取結(jié)果。
          如果做成實(shí)時(shí)的,系統(tǒng)肯定會(huì)受不了,當(dāng)然專業(yè)網(wǎng)站除外。  回復(fù)  更多評(píng)論
            

          # re: oracel dbms_jobs的使用 2008-07-15 14:50 mashiguang
          謝謝樓上的回復(fù).
          寫這篇文章目的主要是記錄oracel dbms_jobs的使用方法,不是記錄排行榜這類東西用什么方案實(shí)現(xiàn).  回復(fù)  更多評(píng)論
            

          # re: oracel dbms_jobs的使用[未登錄](méi) 2008-07-26 13:59 paul
          不知lz是怎么更新的,是先將原table數(shù)據(jù)刪除,在將排好的數(shù)據(jù)insert,如果這樣的話,到了定時(shí)更新時(shí)間后臺(tái)正在更新。會(huì)不會(huì)造成前臺(tái)無(wú)數(shù)據(jù)顯示啊  回復(fù)  更多評(píng)論
            

          # re: oracel dbms_jobs的使用 2008-07-28 10:14 mashiguang
          樓上說(shuō)的是,的確會(huì)出現(xiàn)無(wú)數(shù)據(jù)顯示的情況,我選擇每天18點(diǎn)運(yùn)行,是因?yàn)檫@個(gè)頁(yè)面主要是美國(guó)的客戶訪問(wèn),估計(jì)他們不會(huì)大清早的訪問(wèn)這個(gè)頁(yè)...
          但這種情況也不是肯定不會(huì)發(fā)生,有更好的辦法嗎?
            回復(fù)  更多評(píng)論
            

          # re: oracel dbms_jobs的使用 2008-07-28 10:21 mashiguang
          先insert,再delete,查的時(shí)候倒序只要最后10條.  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 丰县| 云梦县| 应城市| 潍坊市| 万全县| 黄冈市| 黔西县| 宣汉县| 井冈山市| 阳西县| 青阳县| 乾安县| 黎城县| 河源市| 长汀县| 黔西| 荆门市| 合水县| 孟津县| 万源市| 延寿县| 田阳县| 太仆寺旗| 临城县| 义马市| 上思县| 香港| 湘潭县| 读书| 东至县| 淮南市| 丹江口市| 奇台县| 英超| 叶城县| 筠连县| 汉寿县| 平遥县| 彩票| 郯城县| 通化县|