4

我目前正在使用 JDBC 作业存储在负载平衡环境中设置 Quartz,我想知道每个人如何管理 Quartz 作业存储数据库。

对我来说,Quartz (2.2.0) 将作为版本化应用程序的一部分进行部署,同时可能在一台服务器上存在多个版本。我使用符号 XXScheduler_v1 来确保多个调度程序一起运行良好。我的代码工作正常,石英表被适当地填充了触发器/作业/等。

我注意到的一件事是,在取消部署应用程序时似乎没有发生数据库清理。我的意思是作业/调度程序数据似乎保留在石英数据库中,即使不再有调度程序处于活动状态。

这不太理想,我可以想象使用我的模型,数据库会随着时间的推移变得比它需要的更大。我是否错过了如何连接一些清理过程?还是石英希望我们手动进行数据库清理?

干杯!

4

4 回答 4

7

一旦我遇到了这个问题,这就是我为纠正这个问题所做的。这肯定会起作用,但如果它不起作用,那么我们将备份表格,因此您在尝试此操作时不会有任何松动。

  1. 使用下面提到的方法获取下表的 sql 转储:备份单个表
    a) QRTZ_CRON_TRIGGERS
    b) QRTZ_SIMPLE_TRIGGERS
    c) QRTZ_TRIGGERS
    d) QRTZ_JOB_DETAILS
  1. 按顺序从上面的表中删除数据

     delete from QRTZ_CRON_TRIGGERS
     delete from QRTZ_SIMPLE_TRIGGERS
     delete from QRTZ_TRIGGERS
     delete from QRTZ_JOB_DETAILS 
    
  2. 重新启动您的应用程序,然后将所有已删除的任务和相关条目重新插入上表(前提是您的应用程序具有正确的逻辑)。

这更像是在第一次安排所有任务的情况下启动您的应用程序。因此,您必须记住,任务的行为就像是新插入的一样。

注意:如果这不起作用,则应用您为表所做的备份并尝试更仔细地调试。到目前为止,我还没有看到这种方法失败。

于 2015-06-01T11:46:10.397 回答
0

你没有错过任何东西。

但是,这些石英表与您在数据模型中使用的任何应用程序数据库对象没有什么不同。您添加Employees表,在以后的版本中您不再需要它。谁负责删除旧表?只有你。如果你是一名 DBA,你可能会在 DBA 上滚动它;)。

这种维护通常会使用卸载脚本/向导、升级脚本/向导或在新版本的应用程序首次启动期间完成。


附带说明一下,通常不同的应用程序使用不同的数据库,或者至少使用不同的模式,从而减少相互依赖。

于 2013-07-17T21:55:49.113 回答
0

在取消部署应用程序或关闭调度程序时,它绝对不会进行任何数据库清理。您必须在应用程序关闭期间构建一些清理代码(即构建某种 StartupServlet 或上下文侦听器来对 destroy() 事件生命周期进行清理)

于 2013-07-17T21:37:32.710 回答
0

要清理 Quartz Scheduler 内部数据,需要更多 SQL:

delete from QRTZ_CRON_TRIGGERS;
delete from QRTZ_SIMPLE_TRIGGERS;
delete from QRTZ_TRIGGERS;
delete from QRTZ_JOB_DETAILS;
delete from QRTZ_FIRED_TRIGGERS;
delete from QRTZ_LOCKS;
delete from QRTZ_SCHEDULER_STATE;
于 2020-01-27T14:57:59.237 回答