【问题标题】:best practices with Oracle DBMS_SchedulerOracle DBMS_Scheduler 的最佳实践
【发布时间】:2015-12-02 22:29:17
【问题描述】:

Oracle DBMS_Scheduler 有什么好处?

  1. 每次都安排(禁用)作业。并在需要时启用并运行它。
  2. 创建作业,运行它然后删除它。

我有一个表 x,每当有记录提交到该表时,我应该有一份工作来处理该记录。 我们可能会或可能不会总是有记录插入.. 牢记这一点......有什么更好的......?

【问题讨论】:

  • 锁喜欢创建一个调度器作业来只执行一次(或偶尔)你的作业。这不是调度程序作业的目的。目的是定期运行作业。
  • 这大概是第 60.000 个预言机问题 :)
  • @Wernfried:我经常使用dbms_scheduler 在后台只运行一次作业,这样我就可以断开/关闭我的 SQL 客户端,而无需等待冗长的结果操作。
  • 有一个不错的运算符(至少在 Unix/Linux 上)你可以附加到你的命令:&
  • @Wernfried DBMS_SCHEDULER crontab。使用DBMS_SCHEDULER 在后台处理一次性作业是完全合法的,使用DBMS_SCHEDULER 运行数据库作业比使用后台shell 进程更有意义。这样您就可以将数据库活动保留在它所属的数据库中。

标签: oracle plsql oracle11g dbms-scheduler


【解决方案1】:

在异步过程中处理出现在表中的行可以通过多种不同方式完成,选择适合您的方式:

  1. 向表中添加一个触发器,该触发器创建一个一次性作业以使用DBMS_JOB 处理行。如果插入到表中的数据量非常低,并且您不希望您的作业一直运行,这将是合适的。 DBMS_JOB 的优点是在插入提交之前作业不会启动;如果回滚,作业也会回滚,因此不会运行。缺点是,如果活动持续激增,所有创建的作业都会排挤其他正在运行的作业。

  2. 使用定期运行的DBMS_SCHEDULER 创建单个作业,轮询表中的新记录并进行处理。此方法需要表上的一列,它可以更新以将每条记录标记为“已处理”。例如,添加一个VARCHAR2(1) 标志,该标志在插入时设置为'Y',并在处理后由作业设置为NULL。您可以向该标志添加一个索引,该索引将只存储未处理行的条目(因此它会小而快)。这种方法效率更高,尤其是对于大数据量,因为每次运行作业都可以一次有效地批量处理大块数据。

  3. 使用 Oracle 高级队列。 http://docs.oracle.com/cd/E11882_01/server.112/e11013/aq_intro.htm#ADQUE0100

对于 (1),为表中的每条记录创建一个单独的作业。您不需要创建工作。但是,您确实需要监视它们;如果其中一个失败,您将需要手动调查并重新运行。

对于 (2),您只需创建一个作业并让它定期运行。如果一个记录失败,它可能会被工作的下一次迭代拾取。我会在单独的事务中处理每条记录,因此一条记录的失败不会影响仍在队列中的其他记录的失败。

对于 (3),您仍然像 (2) 一样创建作业,但不是读取表,而是从队列中拉出请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 2014-06-21
    • 2023-04-10
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多