RAMJobStore
RAMJobStore是最简单的JobStore,性能也是更高的(在CPU时间方面)。RAMJobStore人如其名:它将所有数据保存到RAM里。这就是为什么它快如闪电,且易于配置。它的缺点是,当你的应用结束(或者崩溃)时,所有的调度信息都会丢失:这意思是说对于job和trigger,RAMJobStore不具有“非易失性”。对于一些应用来来说这是可以接受的,甚至是希望的行为。但是对于其它一些应用来说,者可能是灾难性的。
要使用RAMJobStore(且假设你使用的是StdSchedulerFactory),只需要在配置Quartz时简单的指定JobSotre类属性为类名org.quartz.simpl.RAMJobStore:
配置Quartz使用RAMJobStore
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
JDBCJobStore
JDBCJobStore也是恰如其名,它通过JDBC将数据保存到数据库中。因此,它比RAMJobStore更加复杂,也没那么快。然而,性能缺点不是那么可怕,尤其你用主键作为索引构建数据库表。在现代的具有相当好的局域网的机器上,获取和更新trigger的时间不超过10毫秒。
JDBCJobStore几乎可以与任何数据库一起工作,它广泛应用于Oracle、PostgreSQL、MySQL、MS SQLServer、HSQLDB和DB2。要使用JDBCJobStore,你必须首先为Quartz创建数据库表。你可以在Quartz发布包的docs/dbTables目录找到创建数据表的SQL脚本。如果没有你的数据库的脚本,就看看已有的脚本,然后修改一下。要注意的一件事是在这些脚本中,所有数据表都是以“QRTZ_”前缀开头(例如“QRTZ_TRIGGERS”和“QRTZ_JOB_DETAIL”)。这个前缀实际可以使任何值,只要你将前缀告诉JDBCJobStore即可(在Quartz properties中)。使用不同的前缀可以再相同的数据库中为多个scheduler实例创建多个数据库表。
一旦你获取到数据表,在配置和使用JDBCJobStore之前,你还有一个更加重要的决定。你需要确定你的应用使用的事务类型。如果你不需要将调度命名(如增加和删除trigger)绑定到其它的事务上,那么你可以让Quartz用JobStoreTX来管理事务(这是大部分情况的选择)。
如果你需要Quartz与其它的事务一起工作(即在J2EE应用服务器内),那么你应该使用JobStoreCMT:这种情况下,Quartz会让应用服务器来管理事务。
最后一个问题就是设置DataSource,JDBCJobStore可以从DataSource获取数据库的连接。DataSource可以使用下面的方法在Quartz属性中定义。一种方法时让Quarz自己创建和管理DataSource:提供数据库连接的所有信息。另一种方法就是让Quartz使用由应用服务器管理的DataSource:为JDBCJobStore提供DataSource的JNDI名。关于这些属性的详细信息,请查阅docs/config文件夹下的示例配置文件。
要使用JDBCJobStore(且假设你使用的是StdSchedulerFactory),你首先需要在Quartz配置中设置JobStore类属性的值为org.quartz.impl.jdbcjobstore.JobStoreTX或or org.quartz.impl.jdbcjobstore.JobStoreCMT:用哪个值依赖于你的选择。
配置Quartz使用JobStoreTx
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
接下来,你需要为JobStore选择DriverDelegate。DriverDelegate负责所有有关数据库的JDBC工作。StdJDBCDelegate使用普通的SQL语句完成这个工作。如果没有你数据库的代理,你就可以使用这个代理。我们只创建了特定数据库的代理,因为使用StdJDBCDelegate大多数情况下会出问题。其它的代理可以再“org.quartz.impl.jdbcjobstore”包或者子包中找到。其它的代理包括DB2v6Delegate(DB2 6以前版本)、HSQLDBDelegate(HSQLDB)、MSSQLDelegate(Microsoft SQLServer)、PostgreSQLDelegate (PostgreSQL)、WeblogicDelegate(使用Weblogic的JDBC驱动)、OracleDelegate (Oracle)等待。
一旦你选择了代理,就将它的名字设置为JDBCJobStore要使用的代理吧。
配置JDBCJobStore使用DriverDelegate
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
接下来,你需要通知JobStore你用的数据表前缀是什么。
配置JDBCJobStore使用的数据表前缀
org.quartz.jobStore.tablePrefix = QRTZ_
最后,你需要设置JobStore应该使用哪一个DataSource。DataSource也必须定义在Quartz属性中。在示例中,我们指定Quartz使用的DataSource名字为“myDS”(在别处定义的配置属性)。
配置JDBCJobStore要使用的DataSource的名字
org.quartz.jobStore.dataSource = myDS
评论区