Open-Source World

          let's learn and study.
          posts - 28, comments - 23, trackbacks - 0, articles - 1
          對于JAVA系統(tǒng)中的定時操作有兩種實現(xiàn)方式(針對oarcle):

            1. 通過程序在應(yīng)用層實現(xiàn),如quartz,Timer等

            如在spring中:

          <bean id="abcJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

          <property name="targetObject"><ref bean="abcService"/></property>

          <property name="targetMethod"><value>abc</value></property>

          </bean>



          <bean id="abcTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">

          <property name="jobDetail">

          <ref bean="abcJobDetail"/>

          </property>

          <property name="cronExpression">

          <value>0 0 4 * * ?</value>

          </property>

          </bean>



          <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

          <property name="triggers">

          <list>

          <ref local="abcTrigger"/>

          </list>

          </property>

          </bean>

            2. 直接在數(shù)據(jù)庫層實現(xiàn),先寫個存儲過程,然后創(chuàng)建一個job,定時執(zhí)行該存儲過程。

            具體方法如下:

            DBMS_JOB系統(tǒng)包是Oracle“任務(wù)隊列”子系統(tǒng)的API編程接口。DBMS_JOB包對于任務(wù)隊列提供了下面這些功能:提交并且執(zhí)行一個任務(wù)、改變?nèi)蝿?wù)的執(zhí)行參數(shù)以及刪除或者臨時掛起任務(wù)等。




            DBMS_JOB包中所有的過程都有一組相同的公共參數(shù),用于定義任務(wù),任務(wù)的運行時間以及任務(wù)定時運行的時間間隔。

            下面我們來詳細(xì)討論這些參數(shù)的意義及用法。

          1、job參數(shù)

            job是一個整數(shù),用來唯一地標(biāo)示一個任務(wù)。該參數(shù)既可由用戶指定也可由系統(tǒng)自動賦予,這完全取決于提交任務(wù)時選用了那一個任務(wù)提交過程。DBMS_JOB.SUBMIT過程通過獲得序列SYS.JOBSEQ的下一個值來自動賦予一個任務(wù)號。該任務(wù)號是作為一個OUT參數(shù)返回的,所以調(diào)用者隨后可以識別出提交的任務(wù)。而DBMS_JOB.ISUBMIT過程則由調(diào)用者給任務(wù)指定一個識別號,這時候,任務(wù)號的唯一性就完全取決于調(diào)用者了。

          2、what

           what參數(shù)是一個可以轉(zhuǎn)化為合法PL/SQL調(diào)用的字符串,該調(diào)用將被任務(wù)隊列自動執(zhí)行。在what參數(shù)中,如果使用文字字符串,則該字符串必須用單引號括起來。 what參數(shù)也可以使用包含我們所需要字符串值的VARCHAR2變量。實際的PL/SQL調(diào)用必須用分號隔開。在PL/SQL調(diào)用中如果要嵌入文字字符串,則必須使用兩個單引號。

          what參數(shù)的長度在Oracle7.3中限制在2000個字節(jié)以內(nèi),在Oracle 8.0以后,擴(kuò)大到了4000個字節(jié),這對于一般的應(yīng)用已完全足夠。該參數(shù)的值一般情況下都是對一個PL/SQL存儲過程的調(diào)用。在實際應(yīng)用中,盡管可以使用大匿名Pl/SQL塊,但建議大家最好不要這樣使用。還有一個實際經(jīng)驗就是最好將存儲過程調(diào)用封裝在一個匿名塊中,這樣可以避免一些比較莫名錯誤的產(chǎn)生。我來舉一個例子,一般情況下,what參數(shù)可以這樣引用:

          what =>‘my_procedure(parameter1);’

          但是比較安全的引用,應(yīng)該這樣寫:

          what =>‘begin my_procedure(parameter1); end;’

          3、next_date Next_

            date參數(shù)是用來調(diào)度任務(wù)隊列中該任務(wù)下一次運行的時間。這個參數(shù)對于DBMS_JOB.SUBMIT和DBMS_JOB.BROKEN這兩個過程缺省為系統(tǒng)當(dāng)前時間,也就是說任務(wù)將立即運行。

          當(dāng)將一個任務(wù)的next_date參數(shù)賦值為null時,則該任務(wù)下一次運行的時間將被指定為4000年1月1日,也就是說該任務(wù)將永遠(yuǎn)不再運行。在大多數(shù)情況下,這可能是我們不愿意看到的情形。但是,換一個角度來考慮,如果想在任務(wù)隊列中保留該任務(wù)而又不想讓其運行,將next_date設(shè)置為null卻是一個非常簡單的辦法。

          Next_date也可以設(shè)置為過去的一個時間。這里要注意,系統(tǒng)任務(wù)的執(zhí)行順序是根據(jù)它們下一次的執(zhí)行時間來確定的,于是將next_date參數(shù)設(shè)置回去就可以達(dá)到將該任務(wù)排在任務(wù)隊列前面的目的。這在任務(wù)隊列進(jìn)程不能跟上將要執(zhí)行的任務(wù)并且一個特定的任務(wù)需要盡快執(zhí)行時是非常有用的。

          4、Interval

            Internal參數(shù)是一個表示Oracle合法日期表達(dá)式的字符串。這個日期字符串的值在每次任務(wù)被執(zhí)行時算出,算出的日期表達(dá)式有兩種可能,要么是未來的一個時間要么就是null.這里要強(qiáng)調(diào)一點:很多開發(fā)者都沒有意識到next_date是在一個任務(wù)開始時算出的,而不是在任務(wù)成功完成時算出的。

            當(dāng)任務(wù)成功完成時,系統(tǒng)通過更新任務(wù)隊列目錄表將前面算出的next_date值置為下一次任務(wù)要運行的時間。當(dāng)由interval表達(dá)式算出next_date是null時,任務(wù)自動從任務(wù)隊列中移出,不會再繼續(xù)執(zhí)行。因此,如果傳遞一個null值給interval參數(shù),則該任務(wù)僅僅執(zhí)行一次。

          6. no_parse參數(shù)

            指示此工作在提交時或執(zhí)行時是否應(yīng)進(jìn)行語法分析

            TRUE指示此PL/SQL代碼在它第一次執(zhí)行時應(yīng)進(jìn)行語法分析,

            而FALSE指示本PL/SQL代碼應(yīng)立即進(jìn)行語法分析。

            算法任務(wù)重復(fù)運行的時間間隔取決于interval參數(shù)中設(shè)置的日期表達(dá)式。下面就來詳細(xì)談?wù)勗撊绾卧O(shè)置interval參數(shù)才能準(zhǔn)確滿足我們的任務(wù)需求。一般來講,對于一個任務(wù)的定時執(zhí)行,有三種定時要求。

          在一個特定的時間間隔后,重復(fù)運行該任務(wù)。

          在特定的日期和時間運行任務(wù)。

          任務(wù)成功完成后,下一次執(zhí)行應(yīng)該在一個特定的時間間隔之后。

          第一種調(diào)度任務(wù)需求的日期算法比較簡單,即'SYSDATE+n',這里n是一個以天為單位的時間間隔。表6給出了一些這種時間間隔設(shè)置的例子。

            第二種調(diào)度任務(wù)需求相對于第一種就需要更復(fù)雜的時間間隔(interval)表達(dá)式,表是一些要求在特定的時間運行任務(wù)的interval設(shè)置例子。

          CREATE OR REPLACE PROCEDURE raise_salary (emp_id INTEGER, increase REAL) IS
          current_salary REAL;
          salary_missing EXCEPTION;
          BEGIN
          SELECT sal INTO current_salary FROM emp
          WHERE empno = emp_id;
          IF current_salary IS NULL THEN
          RAISE salary_missing;

          ELSE
          UPDATE emp SET sal = sal + increase
          WHERE empno = emp_id;
          END IF;
          EXCEPTION
          WHEN NO_DATA_FOUND THEN
          INSERT INTO emp_audit VALUES (emp_id, 'No such number');
          WHEN salary_missing THEN
          INSERT INTO emp_audit VALUES (emp_id, 'Salary is null');
          END raise_salary;

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 承德市| 青河县| 韶关市| 雅江县| 宁阳县| 恭城| 玛曲县| 淄博市| 仙桃市| 饶平县| 霍邱县| 泰来县| 甘洛县| 岳阳市| 乌拉特前旗| 丹凤县| 仪征市| 伽师县| 宜昌市| 平谷区| 枞阳县| 读书| 孟州市| 手机| 日照市| 健康| 建平县| 遂昌县| 晋宁县| 金昌市| 四子王旗| 南江县| 开平市| 邛崃市| 绵阳市| 当阳市| 高安市| 昆山市| 澳门| 习水县| 喀喇沁旗|