JDBCJobStore用于在關(guān)系數(shù)據(jù)庫(kù)中存儲(chǔ)調(diào)度信息(Jobs,Triggers和calendars)。實(shí)際上,您可以選擇兩個(gè)獨(dú)立的JDBCJobStore類(lèi),具體取決于您需要的事務(wù)性行為。
JobStoreCMT依賴于正在使用Quartz的應(yīng)用程序管理的事務(wù)。在嘗試安排(或取消調(diào)度)jobs/Triggers之前,JTA事務(wù)必須進(jìn)行中。這使得調(diào)度的“工作”成為應(yīng)用程序“較大”事務(wù)的一部分。JobStoreCMT實(shí)際上需要使用兩個(gè)數(shù)據(jù)源,一個(gè)是由應(yīng)用程序服務(wù)器(通過(guò)JTA)管理的連接的事務(wù),另一個(gè)數(shù)據(jù)源具有不參與全局(JTA)事務(wù)的連接。當(dāng)應(yīng)用程序使用JTA事務(wù)(例如通過(guò)EJB會(huì)話Bean)來(lái)執(zhí)行其工作時(shí),JobStoreCMT是適當(dāng)?shù)摹?/p>
通過(guò)設(shè)置“org.quartz.jobStore.class”屬性來(lái)選擇JobStore:
將計(jì)劃程序的JobStore設(shè)置為JobStoreCMT
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT
JobStoreCMT可以使用以下屬性進(jìn)行調(diào)整:
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 了解不同數(shù)據(jù)庫(kù)系統(tǒng)的特定“dialects”??赡艿倪x擇包括:
請(qǐng)注意,許多數(shù)據(jù)庫(kù)已知與StdJDBCDelegate一起工作,而其他數(shù)據(jù)庫(kù)與其他數(shù)據(jù)庫(kù)的代理人合作,例如Derby與Cloudscape代理(不出意外)工作良好。
org.quartz.jobStore.dataSource
此屬性的值必須是配置屬性文件中定義的DataSource的名稱(chēng)。對(duì)于JobStoreCMT,需要該DataSource包含能夠參與JTA(例如容器管理的)事務(wù)的連接。這通常意味著DataSource將在應(yīng)用程序服務(wù)器內(nèi)部進(jìn)行配置和維護(hù),Quartz將通過(guò)JNDI獲得一個(gè)句柄。有關(guān)更多信息,請(qǐng)參閱DataSources的配置文檔。
org.quartz.jobStore.nonManagedTXDataSource
JobStoreCMT 需要一個(gè)(第二個(gè))數(shù)據(jù)源,其中包含不會(huì)是容器管理事務(wù)的一部分的連接。此屬性的值必須是配置屬性文件中定義的DataSource的名稱(chēng)。此數(shù)據(jù)源必須包含非CMT連接,或換句話說(shuō),Quartz直接調(diào)用commit()和rollback()的合法連接。
org.quartz.jobStore.tablePrefix
JDBCJobStore的“表前綴”屬性是一個(gè)等于在數(shù)據(jù)庫(kù)中創(chuàng)建的Quartz表的前綴的字符串。如果使用不同的表前綴,則可以在同一數(shù)據(jù)庫(kù)中擁有多組Quartz表。
org.quartz.jobStore.useProperties
“使用屬性”標(biāo)志指示JDBCJobStore,JobDataMaps中的所有值都將是“字符串”,因此可以將其存儲(chǔ)為名稱(chēng) - 值對(duì),而不是以BLOB列的序列化形式存儲(chǔ)更復(fù)雜的對(duì)象。這可以方便,因?yàn)槟苊饬藢⒎荢tring類(lèi)序列化為BLOB時(shí)可能產(chǎn)生的類(lèi)版本控制問(wèn)題。
org.quartz.jobStore.misfireThreshold
在被認(rèn)為“misfired”之前,調(diào)度程序?qū)ⅰ皌olerate”一個(gè)Triggers將其下一個(gè)啟動(dòng)時(shí)間通過(guò)的毫秒數(shù)。默認(rèn)值(如果您在配置中未輸入此屬性)為60000(60秒)。
org.quartz.jobStore.isClustered
設(shè)置為“true”以打開(kāi)群集功能。如果您有多個(gè)Quartz實(shí)例使用同一組數(shù)據(jù)庫(kù)表,則此屬性必須設(shè)置為“true”,否則您將遇到破壞。
org.quartz.jobStore.clusterCheckinInterval
設(shè)置此實(shí)例“檢入”*與群集的其他實(shí)例的頻率(以毫秒為單位)。影響檢測(cè)失敗實(shí)例的速度。
org.quartz.jobStore.maxMisfiresToHandleAtATime
在給定的通行證中,工作區(qū)將處理的最大錯(cuò)誤次數(shù)觸發(fā)。一次處理很多(超過(guò)幾十打)可能導(dǎo)致數(shù)據(jù)庫(kù)表被鎖定得足夠長(zhǎng),以致可能會(huì)阻礙其他(未失敗的)Triggers觸發(fā)的性能。
org.quartz.jobStore.dontSetAutoCommitFalse
將此參數(shù)設(shè)置為“true”可以告訴Quartz 在從DataSource獲取的連接上不調(diào)用setAutoCommit(false)。這在一些情況下可能會(huì)有所幫助,例如,如果您有一個(gè)驅(qū)動(dòng)程序,如果它已經(jīng)關(guān)閉時(shí)被調(diào)用,則會(huì)抱怨。此屬性默認(rèn)為false,因?yàn)榇蠖鄶?shù)驅(qū)動(dòng)程序要求調(diào)用setAutoCommit(false)。
org.quartz.jobStore.dontSetNonManagedTXConnectionAutoCommitFalse
與屬性org.quartz.jobStore.dontSetAutoCommitFalse相同,但它適用于非ManagedTXDataSource。
org.quartz.jobStore.selectWithLockSQL
必須是在“LOCKS”表中選擇一行并在該行上放置一個(gè)鎖的SQL字符串。如果未設(shè)置,默認(rèn)值為“SELECT * FROM {0} LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME =?FOR UPDATE“,適用于大多數(shù)數(shù)據(jù)庫(kù)。在運(yùn)行時(shí)使用上面配置的TABLE_PREFIX替換“{0}”?!皗1}”被替換為調(diào)度程序的名稱(chēng)。
org.quartz.jobStore.txIsolationLevelSerializable
值“true”告訴Quartz 在JDBC連接上調(diào)用setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE)。這可以有助于防止在高負(fù)載下的某些數(shù)據(jù)庫(kù)的鎖定超時(shí)以及“持久”事務(wù)。
org.quartz.jobStore.txIsolationLevelReadCommitted
當(dāng)設(shè)置為“true”時(shí),此屬性告訴Quartz 在非托管JDBC連接上調(diào)用setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED)。這有助于防止在高負(fù)載下的某些數(shù)據(jù)庫(kù)(如DB2)和“持久”事務(wù)的鎖超時(shí)。
org.quartz.jobStore.acquireTriggersWithinLock
是否在明確的數(shù)據(jù)庫(kù)鎖中發(fā)生觸發(fā)下一個(gè)Triggers的觸發(fā)。這曾經(jīng)是必需的(在以前的Quartz版本中),以避免與特定數(shù)據(jù)庫(kù)的死鎖,但不再需要,因此默認(rèn)值為“false”。
如果“org.quartz.scheduler.batchTriggerAcquisitionMaxCount”設(shè)置為> 1,并使用JDBC JobStore,則此屬性必須設(shè)置為“true”以避免數(shù)據(jù)損壞(從Quartz 2.1.1開(kāi)始,“true”現(xiàn)在是默認(rèn)值如果batchTriggerAcquisitionMaxCount設(shè)置為> 1)。
org.quartz.jobStore.lockHandler.class
用于生成用于鎖定作業(yè)存儲(chǔ)數(shù)據(jù)控件的org.quartz.impl.jdbcjobstore.Semaphore實(shí)例的類(lèi)名稱(chēng)。這是一個(gè)高級(jí)配置功能,大多數(shù)用戶不應(yīng)該使用它。默認(rèn)情況下,Quartz將選擇最適合(預(yù)捆綁)的Semaphore實(shí)現(xiàn)來(lái)使用?!皁rg.quartz.impl.jdbcjobstore.UpdateLockRowSemaphore” QUARTZ-497可能對(duì)MS SQL Server用戶很感興趣。與Quartz捆綁在一起的“JTANonClusteredSemaphore”可以在使用JobStoreCMT時(shí)提高性能,盡管它是一個(gè)實(shí)驗(yàn)性實(shí)現(xiàn)。參見(jiàn)QUARTZ-441和QUARTZ-442
org.quartz.jobStore.driverDelegateInitString
一個(gè)以管道分隔的屬性列表(及其值),可以在初始化時(shí)間內(nèi)傳遞給DriverDelegate。
字符串的格式是這樣的:
“settingName = settingValue | otherSettingName = otherSettingValue | ...”
StdJDBCDelegate及其所有后代(Quartz附帶的所有代理)都支持一個(gè)名為“triggerPersistenceDelegateClasses”的屬性,該屬性可以設(shè)置為實(shí)現(xiàn)用于存儲(chǔ)自定義觸發(fā)器類(lèi)型的TriggerPersistenceDelegate接口的類(lèi)的逗號(hào)分隔列表。有關(guān)為自定義Triggers編寫(xiě)持久性委托的示例,請(qǐng)參閱Java類(lèi)SimplePropertiesTriggerPersistenceDelegateSupport和SimplePropertiesTriggerPersistenceDelegateSupport。
更多建議: