SCHEDULE(调度程序)

本文介绍了Oracle数据库中的调度程序功能,包括其在不同版本中的发展、体系结构和主要对象。涵盖了作业、程序、时间表等概念及其创建方法。
很多情况下,数据库管理员或用户需要自动调度和运行很多类型的作业,例如,执行维护工作(如数据库备份);数据加载和验证例程;
生成报表;收集优化程序统计信息或执行业务流程。可以使用调度程序功能指定任务在将来某个时间点运行。作业可以在数据库中、在驻
留数据库实例的机器上甚至在远程机器上运行。
可以结合使用调度程序和Resource Manager(资源管理器)。调度程序可以激活Resource Manager计划,并按照为各种Resource Manager
使用者组指定的优先级来运行作业。
调度程序是在Oracle 10g版本中引入的,在11g版本中得到了大大增强。较早的数据库版本通过DBMS_JOB功能提供作业调度功能。为了达
达到向后兼容的目的,当前版本依然支持此功能,但它的功能多样性远不及调度程度。


1、调度程序体系结构
数据字典包含一个作为所有调度程序作业的存储点的表。可以通过DBA_SCHEDULER_JOBS视图查询此表。作业队列协调器后台进程CJQ0
监视此表,根据需要启动作业队列进程Jnnn来运行作业。如果在任何定义的、活动的调度程序作业,就自动启动CJBQ0进程。根据需要启
动Jnnn进程,但是最大数量受JOB_QUEUE_PROCESSES实例参数限制,该参数可以是0-1000(默认值)的任何值。如果将值设为0,那么将不会
运行调程。
作业队列协调器从作业队列表中选取作业,将它们传递给作业队列进程执行。它还根据需要启动和终止作业队列进程。要查看当前正在
运行的进程,可查询V$PROCESS视图。
select program from v$process where program like '%J%';


定义为过程的作业在数据库中运行。作业也可以定义为操作系统命令或shell脚本:这些将作为外部操作系统任务运行。作业的触发因素
可以是时间或事件。基于时间的作业根据时间表可能运行一次或重复运行。基本事件的作业在特定条件出现时运行。有一些预配置的事件,
也可以使用用户定义的事件。作业可以连接成链,根据作业成功与否对分支使用简单规则。
调度程度的一项高级功能是将期与Resource Manager相关联。某些作业可能需要优先运行,为此,可以链接作业与Resource Manager
使用都组,以便达到这个目的。还可以使用调度程序激活Resource Manager计划,而不需要通过更改RESOURCE_MANAGER_PLAN实例参数或使
用DBMS_RESOURCE_MANAGER.SWITCH_PLAN过程调用手动激活计划。
可以使用一个API-DBMS_SCHEDULER包来配置调度程序,通过一组数据字典视图监视它,或是用Database Control管理它。

2、调度程序对象
调度程序对象中最基本的对象是作业。作业可以是完全自包含的:它可以定义要执行的动作和执行时间。在更高级的配置中,作业只是
由大量各种类型的调度程序对象组成的结构的一部分。


2.1 作业
作业(job)指定了要执行的动作以及执行动作的时间。
“ 要执行的动作”可以是匿名的PL/SQL块(可能由单条SQL语句构成)、PL/SQL存储过程(可调用JAVA存储过程或外部过程)、
或在服务器的文件系统中存储任何可执行文件(既可以是二进制可执行文件,也可以是SHELL脚本)。特别强大的功能(超出OCP
课程的范围)是远程外部作业,该作业在一台单独的机器上运行。
“执行动作的时间”指定了启动作业时的时间戳以及用于今后运行的重复时间间隔,或是触发事件。
DBMS_SCHEDULER.CREATE_JOB


2.2 程序
程序(program)在作业与其将要执行的动作之间提供了一个抽象层。程序是使用DBMS_SCHEDULER.CREATE_PROGRAM过程创建的。
通过从作业定义中取出作业内容并在程序中加以定义,就可以在不同的作业中引用相同的程序,从而不必进行多次定义就可以将
它与不同的时间表和作业类关联在一起。需要记住的是:就是作业而言,只有启用程序才能使用它。默认是不启用。


2.3 时间表
时间表(schedule)是指定作业运行时间与频率的规范。时间表的基本原理是从作业中取出执行作业的时间,然后将其与不同的的
作业关联。是时间表是使用DBMS_SCHEDULER.CREATE_SHEDULE


2.4 作业类
作业类用于将一个或多个作业与一个Resource Manager使用者组关联在一起,并且也可以用于失控制日志记录级别。
DBMS_SCHEDULER.CREATE_JOB_CLASS


2.5 窗口
时间表准确地指定了作业应当启动的时间。通过使用Oracle能够更自由地决定启动作业的时间,窗口(window)进一步扩展了
时间表的概念。一个窗口在特定时间打开,并且在持续一定的时间之后关闭:指定在某个窗口中运行的作业可以根据Oracle的判断
在该窗口期间的任何时刻启动。窗口本身可以根据时间表重复打开。结合类与Resource Manager时使用窗口具有特殊的意义:Oracle
能够根据相对优先权在窗口内调度作业来运行。此外窗口也可以激活Resource Manager计划。
DBMS_SCHEDULER.CREATE_WINDOW

从什么时间点开始,续继多久时间,能过Resource Plan限制资源使用。




操作如图所示:















### 作业调度程序的实现方式、框架与工具 作业调度程序是一种用于管理和执行定时任务的技术解决方案,其核心目标是根据预定义规则或条件自动执行任务。以下是关于作业调度程序实现方式、框架和工具的相关信息: #### 实现方式 作业调度程序可以通过多种方式实现,常见的方法包括基于时间触发、事件驱动以及分布式架构设计。例如,在SAP系统中,如果需要将下传接口定义为作业,则可以通过输入接口编号作为JOB编号来实现[^1]。此外,对于其他系统,可以使用编程语言中的定时器功能(如Python中的`time.sleep()`或`schedule`库)或操作系统的任务计划程序(如Windows Task Scheduler或Linux Cron Jobs)。 #### 框架 Quartz是一个广泛使用的开源任务调度框架,支持Java和.NET平台。它的主要工作流程包括定义任务(Job)、指定执行规则(Trigger),并将它们注册到调度器中[^2]。在.NET环境中,Quartz框架的安装可以通过NuGet包管理器完成,命令如下: ```bash Install-Package Quartz ``` 创建Quartz应用通常涉及五个步骤:创建调度器容器、定义任务、创建任务对象、创建触发器,并将任务与触发器添加到调度器中[^3]。 #### 工具 除了Quartz框架外,还有其他一些常用的作业调度工具,例如: - **Airflow**:由Apache开发的数据管道调度工具,适合复杂的工作流管理。 - **Celery**:一个分布式的任务队列工具,支持Python语言,适用于异步任务处理。 - **Kubernetes CronJobs**:用于在Kubernetes集群中运行周期性任务。 - **Jenkins**:虽然主要用于持续集成和部署,但也可以通过插件实现任务调度功能。 以下是一个简单的Quartz.NET示例代码,展示如何创建并运行一个基本的任务调度器: ```csharp using Quartz; using Quartz.Impl; class Program { static async System.Threading.Tasks.Task Main(string[] args) { // 创建调度器工厂 StdSchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = await factory.GetScheduler(); // 启动调度器 await scheduler.Start(); // 定义任务 IJobDetail job = JobBuilder.Create<HelloJob>() .WithIdentity("job1", "group1") .Build(); // 定义触发器 ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .StartNow() .WithSimpleSchedule(x => x.WithIntervalInSeconds(10).RepeatForever()) .Build(); // 将任务与触发器添加到调度器中 await scheduler.ScheduleJob(job, trigger); } } public class HelloJob : IJob { public Task Execute(IJobExecutionContext context) { Console.WriteLine("HelloJob is executing."); return Task.CompletedTask; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值