配置JDBC-JobStoreCMT
JDBCJobStore用于在关系数据库中存储调度信息(Jobs,Triggers和calendars)。实际上,您可以选择两个独立的JDBCJobStore类,具体取决于您需要的事务性行为。
JobStoreCMT依赖于正在使用Quartz的应用程序管理的事务。在尝试安排(或取消调度)jobs/Triggers之前,JTA事务必须进行中。这使得调度的“工作”成为应用程序“较大”事务的一部分。JobStoreCMT实际上需要使用两个数据源,一个是由应用程序服务器(通过JTA)管理的连接的事务,另一个数据源具有不参与全局(JTA)事务的连接。当应用程序使用JTA事务(例如通过EJB会话Bean)来执行其工作时,JobStoreCMT是适当的。
通过设置“org.quartz.jobStore.class”属性来选择JobStore:
将计划程序的JobStore设置为JobStoreCMT
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT
JobStoreCMT可以使用以下属性进行调整:
Property Name | Required | Type | Default Value |
---|---|---|---|
org.quartz.jobStore.driverDelegateClass | yes | string | null |
org.quartz.jobStore.dataSource | yes | string | null |
org.quartz.jobStore.nonManagedTXDataSource | yes | string | null |
org.quartz.jobStore.tablePrefix | no | string | “QRTZ_” |
org.quartz.jobStore.useProperties | no | boolean | false |
org.quartz.jobStore.misfireThreshold | no | int | 60000 |
org.quartz.jobStore.isClustered | no | boolean | false |
org.quartz.jobStore.clusterCheckinInterval | no | long | 15000 |
org.quartz.jobStore.maxMisfiresToHandleAtATime | no | int | 20 |
org.quartz.jobStore.dontSetAutoCommitFalse | no | boolean | false |
org.quartz.jobStore.dontSetNonManagedTXConnectionAutoCommitFalse | no | boolean | false |
org.quartz.jobStore.selectWithLockSQL | no | string | “SELECT * FROM {0}LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME = ? FOR UPDATE” |
org.quartz.jobStore.txIsolationLevelSerializable | no | boolean | false |
org.quartz.jobStore.txIsolationLevelReadCommitted | no | boolean | false |
org.quartz.jobStore.acquireTriggersWithinLock | no | boolean | false (or true – see doc below) |
org.quartz.jobStore.lockHandler.class | no | string | null |
org.quartz.jobStore.driverDelegateInitString | no | string | null |
org.quartz.jobStore.driverDelegateClass
Driver delegates 了解不同数据库系统的特定“dialects”。可能的选择包括:
- org.quartz.impl.jdbcjobstore.StdJDBCDelegate(用于完全符合JDBC的驱动程序)
- org.quartz.impl.jdbcjobstore.MSSQLDelegate(对于Microsoft SQL Server和Sybase)
- org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
- org.quartz.impl.jdbcjobstore.WebLogicDelegate(对于WebLogic驱动程序)
- org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
- org.quartz.impl.jdbcjobstore.oracle.WebLogicOracleDelegate(对于Weblogic中使用的Oracle驱动程序)
- org.quartz.impl.jdbcjobstore.oracle.weblogic.WebLogicOracleDelegate(对于在Weblogic中使用的Oracle驱动程序)
- org.quartz.impl.jdbcjobstore.CloudscapeDelegate
- org.quartz.impl.jdbcjobstore.DB2v6Delegate
- org.quartz.impl.jdbcjobstore.DB2v7Delegate
- org.quartz.impl.jdbcjobstore.DB2v8Delegate
- org.quartz.impl.jdbcjobstore.HSQLDBDelegate
- org.quartz.impl.jdbcjobstore.PointbaseDelegate
- org.quartz.impl.jdbcjobstore.SybaseDelegate
请注意,许多数据库已知与StdJDBCDelegate一起工作,而其他数据库与其他数据库的代理人合作,例如Derby与Cloudscape代理(不出意外)工作良好。
org.quartz.jobStore.dataSource
此属性的值必须是配置属性文件中定义的DataSource的名称。对于JobStoreCMT,需要该DataSource包含能够参与JTA(例如容器管理的)事务的连接。这通常意味着DataSource将在应用程序服务器内部进行配置和维护,Quartz将通过JNDI获得一个句柄。有关更多信息,请参阅
DataSources
的
配置文档
。
org.quartz.jobStore.nonManagedTXDataSource
JobStoreCMT 需要一个(第二个)数据源,其中包含不会是容器管理事务的一部分的连接。此属性的值必须是配置属性文件中定义的DataSource的名称。此数据源必须包含非CMT连接,或换句话说,Quartz直接调用commit()和rollback()的合法连接。
org.quartz.jobStore.tablePrefix
JDBCJobStore的“表前缀”属性是一个等于在数据库中创建的Quartz表的前缀的字符串。如果使用不同的表前缀,则可以在同一数据库中拥有多组Quartz表。
org.quartz.jobStore.useProperties
“使用属性”标志指示JDBCJobStore,JobDataMaps中的所有值都将是“字符串”,因此可以将其存储为名称 – 值对,而不是以BLOB列的序列化形式存储更复杂的对象。这可以方便,因为您避免了将非String类序列化为BLOB时可能产生的类版本控制问题。
org.quartz.jobStore.misfireThreshold
在被认为“misfired”之前,调度程序将“tolerate”一个Triggers将其下一个启动时间通过的毫秒数。默认值(如果您在配置中未输入此属性)为60000(60秒)。
org.quartz.jobStore.isClustered
设置为“true”以打开群集功能。如果您有多个Quartz实例使用同一组数据库表,则此属性必须设置为“true”,否则您将遇到破坏。
org.quartz.jobStore.clusterCheckinInterval
设置此实例“检入”*与群集的其他实例的频率(以毫秒为单位)。影响检测失败实例的速度。
org.quartz.jobStore.maxMisfiresToHandleAtATime
在给定的通行证中,工作区将处理的最大错误次数触发。一次处理很多(超过几十打)可能导致数据库表被锁定得足够长,以致可能会阻碍其他(未失败的)Triggers触发的性能。
org.quartz.jobStore.dontSetAutoCommitFalse
将此参数设置为“true”可以告诉Quartz 在从DataSource获取的连接上不调用setAutoCommit(false)。这在一些情况下可能会有所帮助,例如,如果您有一个驱动程序,如果它已经关闭时被调用,则会抱怨。此属性默认为false,因为大多数驱动程序要求调用setAutoCommit(false)。
org.quartz.jobStore.dontSetNonManagedTXConnectionAutoCommitFalse
与属性org.quartz.jobStore.dontSetAutoCommitFalse相同,但它适用于非ManagedTXDataSource。
org.quartz.jobStore.selectWithLockSQL
必须是在“LOCKS”表中选择一行并在该行上放置一个锁的SQL字符串。如果未设置,默认值为“SELECT * FROM {0} LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME =?FOR UPDATE“,适用于大多数数据库。在运行时使用上面配置的TABLE_PREFIX替换“{0}”。“{1}”被替换为调度程序的名称。
org.quartz.jobStore.txIsolationLevelSerializable
值“true”告诉Quartz 在JDBC连接上调用setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE)。这可以有助于防止在高负载下的某些数据库的锁定超时以及“持久”事务。
org.quartz.jobStore.txIsolationLevelReadCommitted
当设置为“true”时,此属性告诉Quartz 在非托管JDBC连接上调用setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED)。这有助于防止在高负载下的某些数据库(如DB2)和“持久”事务的锁超时。
org.quartz.jobStore.acquireTriggersWithinLock
是否在明确的数据库锁中发生触发下一个Triggers的触发。这曾经是必需的(在以前的Quartz版本中),以避免与特定数据库的死锁,但不再需要,因此默认值为“false”。
如果“org.quartz.scheduler.batchTriggerAcquisitionMaxCount”设置为> 1,并使用JDBC JobStore,则此属性必须设置为“true”以避免数据损坏(从Quartz 2.1.1开始,“true”现在是默认值如果batchTriggerAcquisitionMaxCount设置为> 1)。
org.quartz.jobStore.lockHandler.class
用于生成用于锁定作业存储数据控件的org.quartz.impl.jdbcjobstore.Semaphore实例的类名称。这是一个高级配置功能,大多数用户不应该使用它。默认情况下,Quartz将选择最适合(预捆绑)的Semaphore实现来使用。“org.quartz.impl.jdbcjobstore.UpdateLockRowSemaphore”
QUARTZ-497
可能对MS SQL Server用户很感兴趣。与Quartz捆绑在一起的“JTANonClusteredSemaphore”可以在使用JobStoreCMT时提高性能,尽管它是一个实验性实现。参见
QUARTZ-441
和
QUARTZ-442
org.quartz.jobStore.driverDelegateInitString
一个以管道分隔的属性列表(及其值),可以在初始化时间内传递给DriverDelegate。
字符串的格式是这样的:
“settingName = settingValue | otherSettingName = otherSettingValue | ...”
StdJDBCDelegate及其所有后代(Quartz附带的所有代理)都支持一个名为“triggerPersistenceDelegateClasses”的属性,该属性可以设置为实现用于存储自定义触发器类型的TriggerPersistenceDelegate接口的类的逗号分隔列表。有关为自定义Triggers编写持久性委托的示例,请参阅Java类SimplePropertiesTriggerPersistenceDelegateSupport和SimplePropertiesTriggerPersistenceDelegateSupport。