对于JAVA系统中的定时操作有两种实现方式(针对oarcle):
1. 通过程序在应用层实现,如quartz,Timer等
如在spring中:
<bean id="abcJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><o:p></o:p>
<property name="targetObject"><ref bean="abcService"/></property><o:p></o:p>
<property name="targetMethod"><value>abc</value></property><o:p></o:p>
</bean> <o:p></o:p>
<o:p></o:p>
<bean id="abcTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"><o:p></o:p>
<property name="jobDetail"><o:p></o:p>
<ref bean="abcJobDetail"/><o:p></o:p>
</property><o:p></o:p>
<property name="cronExpression"><o:p></o:p>
<value>0 0 4 * * ?</value><o:p></o:p>
</property><o:p></o:p>
</bean><o:p></o:p>
<o:p></o:p>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><o:p></o:p>
<property name="triggers"><o:p></o:p>
<list><o:p></o:p>
<ref local="abcTrigger"/><o:p></o:p>
</list><o:p></o:p>
</property><o:p></o:p>
</bean>
2. 直接在数据库层实现,先写个存储过程,然后创建一个job,定时执行该存储过程。
具体方法如下:
DBMS_JOB系统包是Oracle“任务队列”子系统的API编程接口。DBMS_JOB包对于任务队列提供了下面这些功能:提交并且执行一个任务、改变任务的执行参数以及删除或者临时挂起任务等。
<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shape id="_x0000_i1025" style="WIDTH: 387pt; HEIGHT: 258.75pt" type="#_x0000_t75"><v:imagedata o:title="ScreenShot053" src="file:///C:\DOCUME~1\pengch\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"></v:imagedata></v:shape>
<o:p> </o:p>
DBMS_JOB包中所有的过程都有一组相同的公共参数,用于定义任务,任务的运行时间以及任务定时运行的时间间隔。这些公共任务定义参数见表2所示。
<v:shape id="_x0000_i1026" style="WIDTH: 405pt; HEIGHT: 128.25pt" type="#_x0000_t75"><v:imagedata o:title="ScreenShot054" src="file:///C:\DOCUME~1\pengch\LOCALS~1\Temp\msohtml1\01\clip_image002.gif"></v:imagedata></v:shape>
下面我们来详细讨论这些参数的意义及用法。
1、job参数
job是一个整数,用来唯一地标示一个任务。该参数既可由用户指定也可由系统自动赋予,这完全取决于提交任务时选用了那一个任务提交过程。DBMS_JOB.SUBMIT过程通过获得序列SYS.JOBSEQ的下一个值来自动赋予一个任务号。该任务号是作为一个OUT参数返回的,所以调用者随后可以识别出提交的任务。而DBMS_JOB.ISUBMIT过程则由调用者给任务指定一个识别号,这时候,任务号的唯一性就完全取决于调用者了。
2、what
what参数是一个可以转化为合法PL/SQL调用的字符串,该调用将被任务队列自动执行。在what参数中,如果使用文字字符串,则该字符串必须用单引号括起来。 what参数也可以使用包含我们所需要字符串值的VARCHAR2变量。实际的PL/SQL调用必须用分号隔开。在PL/SQL调用中如果要嵌入文字字符串,则必须使用两个单引号。
what参数的长度在Oracle7.3中限制在2000个字节以内,在Oracle 8.0以后,扩大到了4000个字节,这对于一般的应用已完全足够。该参数的值一般情况下都是对一个PL/SQL存储过程的调用。在实际应用中,尽管可以使用大匿名Pl/SQL块,但建议大家最好不要这样使用。还有一个实际经验就是最好将存储过程调用封装在一个匿名块中,这样可以避免一些比较莫名错误的产生。我来举一个例子,一般情况下,what参数可以这样引用:
what =>‘my_procedure(parameter1);’
但是比较安全的引用,应该这样写:
what =>‘begin my_procedure(parameter1); end;’
3、next_date Next_
date参数是用来调度任务队列中该任务下一次运行的时间。这个参数对于DBMS_JOB.SUBMIT和DBMS_JOB.BROKEN这两个过程缺省为系统当前时间,也就是说任务将立即运行。
当将一个任务的next_date参数赋值为null时,则该任务下一次运行的时间将被指定为<st1:chsdate w:st="on" year="4000" month="1" day="1" islunardate="False" isrocdate="False">4000年1月1日</st1:chsdate>,也就是说该任务将永远不再运行。在大多数情况下,这可能是我们不愿意看到的情形。但是,换一个角度来考虑,如果想在任务队列中保留该任务而又不想让其运行,将next_date设置为null却是一个非常简单的办法。<o:p></o:p>
Next_date也可以设置为过去的一个时间。这里要注意,系统任务的执行顺序是根据它们下一次的执行时间来确定的,于是将next_date参数设置回去就可以达到将该任务排在任务队列前面的目的。这在任务队列进程不能跟上将要执行的任务并且一个特定的任务需要尽快执行时是非常有用的。
4、Interval
Internal参数是一个表示Oracle合法日期表达式的字符串。这个日期字符串的值在每次任务被执行时算出,算出的日期表达式有两种可能,要么是未来的一个时间要么就是null.这里要强调一点:很多开发者都没有意识到next_date是在一个任务开始时算出的,而不是在任务成功完成时算出的。<o:p></o:p>
当任务成功完成时,系统通过更新任务队列目录表将前面算出的next_date值置为下一次任务要运行的时间。当由interval表达式算出next_date是null时,任务自动从任务队列中移出,不会再继续执行。因此,如果传递一个null值给interval参数,则该任务仅仅执行一次。
6. no_parse参数
指示此工作在提交时或执行时是否应进行语法分析
TRUE指示此PL/SQL代码在它第一次执行时应进行语法分析,
而FALSE指示本PL/SQL代码应立即进行语法分析。
算法任务重复运行的时间间隔取决于interval参数中设置的日期表达式。下面就来详细谈谈该如何设置interval参数才能准确满足我们的任务需求。一般来讲,对于一个任务的定时执行,有三种定时要求。
在一个特定的时间间隔后,重复运行该任务。
在特定的日期和时间运行任务。
任务成功完成后,下一次执行应该在一个特定的时间间隔之后。
第一种调度任务需求的日期算法比较简单,即'SYSDATE+n',这里n是一个以天为单位的时间间隔。表6给出了一些这种时间间隔设置的例子。
<v:shape id="_x0000_i1027" style="WIDTH: 380.25pt; HEIGHT: 163.5pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:\DOCUME~1\pengch\LOCALS~1\Temp\msohtml1\01\clip_image003.png"></v:imagedata></v:shape>
第二种调度任务需求相对于第一种就需要更复杂的时间间隔(interval)表达式,表是一些要求在特定的时间运行任务的interval设置例子。
<v:shape id="_x0000_i1028" style="WIDTH: 363.75pt; HEIGHT: 229.5pt" type="#_x0000_t75"> <v:imagedata o:title="" src="file:///C:\DOCUME~1\pengch\LOCALS~1\Temp\msohtml1\01\clip_image005.png"></v:imagedata></v:shape>
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;
分享到:
相关推荐
在Java编程环境中,将Oracle数据库的表结构导出到Excel是一种常见的需求,特别是在数据库管理和数据分析时。这个场景可以通过两个核心类来实现:`TableStructureToExcel.java`和`ConnectionOracle.java`。这两个类...
这篇博客文章“Hibernate操作Oracle中Clob、Blob字段小结”可能会探讨如何在Hibernate中有效地处理这两种类型的数据。 1. **Clob与Blob的理解**: - Clob:Clob是用于存储大量字符数据的类型,例如长篇文章、XML...
ASM(Automatic Storage Management)是Oracle提供的一种高级存储管理技术,它通过抽象化的方式管理磁盘组,简化了存储的管理和优化操作。 在安装Oracle 11g RAC + ASM的过程中,会涉及到以下几个关键步骤: 1. ...
Oracle数据库是一种广泛使用的大型关系型数据库管理系统(RDBMS),由Oracle公司开发并维护。它在企业级数据存储、管理和处理方面占据着重要的地位。Oracle数据库支持多种数据类型,包括数值、字符串、日期时间以及...
这两种模式之间的切换对于确保数据完整性和提高系统的容错能力至关重要。 #### 一、理解Oracle数据库归档模式 在归档模式下,Oracle数据库能够自动将已完成的日志文件归档到指定的位置。这意味着,当系统出现故障...
本文详细介绍的oracle数据库如何存储bfile
【飞机订票系统(jsp+servlet)】是一个典型的Web应用程序,它使用了Java技术栈中的JSP(JavaServer Pages)和Servlet,以及Oracle数据库来构建一个完整的线上订票平台。这个系统旨在为用户提供便捷的机票预订服务,...
【描述】:本文主要探讨了如何通过Oracle数据库的事件触发器增强“军卫一号”医院信息系统的安全性,针对系统中存在的用户权限管理漏洞提出解决方案。 【标签】:Oracle数据库、关系型数据库、参考文献、专业指导 ...
Oracle是全球广泛使用的大型关系型数据库管理系统之一,其在企业级数据存储和管理中扮演着重要角色。"Oracle培训资料大全"涵盖了Oracle系统的多个关键方面,对于想要学习或提升Oracle技能的人来说,是一份非常宝贵的...
在IT领域,重装Oracle数据库是一项复杂而细致的工作,尤其对于企业级应用而言,确保数据安全与系统稳定性至关重要。本文将深入探讨“重装Oracle”过程中必须注意的关键点,包括但不限于卸载步骤、注册表清理、环境...
oarcle java 面试题 答案 Java面试 Oracle面试
Oracle数据库是全球广泛使用的数据库管理系统,而PL/SQL(Procedural Language/Structured Query Language)则是Oracle数据库系统中的一种过程化编程语言,用于编写数据库应用程序。PL/SQL结合了SQL的强大查询功能和...
本文将详细介绍四种常见的 C# 访问 Oracle 的方式,并对每种方式的实现原理、适用场景以及注意事项进行深入分析。 #### 一、通过 System.Data.OracleClient(需要安装 Oracle 客户端并配置 tnsnames.ora) **实现...
5. **JTA(Java Transaction API)**:JTA提供了分布式事务处理的标准接口,确保在多组件操作中实现原子性。书中会介绍如何管理事务边界和回滚策略。 6. **JNDI(Java Naming and Directory Interface)**:JNDI为...
有三种主要的方式(完全、用户、表) 1、完全: EXP SYSTEM/MANAGER BUFFER=64000 FILE=C:\FULL.DMP FULL=Y 如果要执行完全导出,必须具有特殊的权限 2、用户模式: EXP SONIC/SONIC BUFFER=64000 FILE=C...
标题中提到的“Oracle®Database 2Day+ Security Guide 11g Release 2 (11.2) E10575-08”指的是Oracle数据库的安全指南文档,适用于Oracle数据库版本11g的第二个更新版(11.2)。E10575-08是该文档的版本号,而日期...
在数据库系统中,当两个或多个事务在等待对方释放资源时会发生死锁。在Oracle数据库中,死锁是由于多个并发操作试图同时锁定同一资源导致的。一旦发生死锁,Oracle会自动检测并解除其中一个事务的锁定,以确保其他...
在构建Oracle DataGuard环境时,通常有两种主要的方法:Redo Apply技术和Duplicate技术。本篇文章主要介绍如何利用Duplicate技术搭建DataGuard环境。Duplicate技术的核心优势在于它可以快速地复制主数据库到备用...
Oracle ADF(Application Development Framework)安全配置是Oracle Fusion Middleware中一个关键部分,它提供了一种强大的方式来构建安全的企业级应用程序。在Oracle ADF中,安全性通常涉及到对资源的访问控制,...