十. 使用資料庫儲存 scheduler 資訊
·載入 job 到資料庫中
在前面有一節,"使用記憶體儲存 scheduler 資訊",我們談到關於在使用 ramjobstore 時如何載入 job 和 trigger 資訊到記憶體中。那麼 job 和 trigger 又是如何載入到資料庫中的呢?存在以下幾個方法把 job 資訊存入到資料庫:
· 在你的程式中加入 job 資訊
· 使用 jobinitializationplugin
· 使用 quartz web 應用程式
我們在前面的 ramjobstore 章節中討論過前面兩種途徑。當它們用於 jdbc jobstore 時,並沒有多大不同,只些許例外。首先,你需要知道,當使用這兩個方法式,job 資訊是在資料庫中的。甚至在你停止了程式後,這些資訊仍然保留在資料庫中。甚至是你不在你的程式中使用 jobinitializationplugin 時,這些資訊也還在資料庫中。基於這一點,它是會從資料庫中找尋 job 資訊。第八章涵蓋了 jobinitializationplugin 和常用的 quartz 外掛程式。
最後一種方法可能是最有意思的。我們還沒有談論到 quartz web 應用,但是我們在第十三章 "quartz 和 web 應用" 是這麼做的。在現在呢,你應當知道 quartz web 應用是乙個基於瀏覽器的 gui 程式,它是設計用來管理 quartz scheduler。它是由 quartz 使用者設計的,它為加入 job 和 trigger、啟動和暫停 scheduler 和發布其他功能呈現了乙個相當好的介面。
通過 sql 工具載入 job
最後還有一種能用於載入 job 資訊的方法,但僅在這兒提一下,並不鼓勵你去嘗試它。這種方法是使用本地 sql 直接操作 quartz 表來嘗試載入和/或修改資訊。使用本地查詢工具來加入 job 資訊到資料庫中只在少數時候這樣做,但是很容易破壞資料進而導致所有 job 不能正確執行。無論如何應盡力避免用這種方法。
十一. 使用 jobstorecmt
許多我們在前面章節對 jobstoretx 所說的和做的對於另一版本的 jdbc jobstore,jobstorecmt 來也是適用的。再說,也沒說所有,這不足為奇,因為它們都是 jobstore 型別,它們都是設計成用 jdbc 來與關係型資料庫互動。也都是繼承自共同的基類。
jobstorecmt 被設計成參與到容器的事物邊界內。這意味著容器建立乙個 jta 事物並使之對於 jobstore 可用。quartz 與 jobstore 的互動保持在這個事物中。假如出現任何問題,quartz 能給容器乙個訊號,它希望通過呼叫事物的 setrollbackonly() 使事物回滾。
·配置 jobstorecmt
同之前的 jobstoretx 和 ramjobstore 一樣,要使用 jobstorecmt 的第一步是告知 scheduler 你打算用 jobstorecmt。和以前類似,也是通過在 quartz.properties 檔案中設定 jobstore 類屬性來做到這一點的:
org.quartz.jobstore.class = org.quartz.impl.jdbcjobstore.jobstorecmt
如果屬性檔案中存在 ramjobstore 行,要確保移除了它。
·配置 driverdelegate 類
你也是需要像為 jobstoretx 所做的那樣選擇 driverdelegate。quartz 依靠乙個 driverdelegate 與給定的資料庫通訊。**負責了與 jdbc driver,也就是資料庫的所有通訊。
回到表 6.2 中的 driverdelegate 列表,並基於你的資料庫平台和環境選擇乙個。要加 ms sqlserver **到 quart.properties 檔案,那就加入下一行:
org.quartz.jobstore.driverdelegateclass = org.quartz.impl.jdbcjobstore.mssqldelegate
你可以使幾個屬性來幫助調整 jobstorecmt。表 6.5 列舉了全部設定項。
表 6.5. 用於設定 jobstorecmt 的配置屬性
屬性
預設值
org.quartz.jobstore.driverdelegateclass
描述:能夠理解不同資料庫系統中特定方言的驅動**
org.quartz.jobstore.datasource
描述:這是乙個用於 quartz.properties 檔案的資料來源配置塊的名字。
org.quartz.jobstore.nonmanagedtxdatasource
描述:jobstorecmt 需要乙個(第二個) 資料來源,它所包含的連線不作為容器管理事特的一部分。 這個屬性值必須是乙個定義在配置屬性檔案中的資料來源的名字。這個資料來源必須包含非容器管理事物(non-cmt) 連線,換名話說就是, 它產生的連線可讓 quartz 直接合法的呼叫它的 commit() 和 rollback() 方法。
org.quartz.jobstore.tableprefix
qrtz_
描述:這是指定給 scheduler 的一套資料庫表名的字首。schedulers 在指定了不同字首時可在同一資料庫中使用不同的表。
org.quartz.jobstore.useproperties
false
描述:"use properties" 標記指示著永續性 jobstore 所有在 jobdatamap 中的值都是字串,因此能以 名-值 對的形式儲存,而不用讓更複雜的物件以序列化的形式存入 blob 列中。這樣會更方便,因為讓你避免了發生於序列化你的非字串的類到 blob 時的有關類版本的問題。
org.quartz.jobstore.misfirethreshold
60000
org.quartz.jobstore.isclustered
false
描述:設定此為 true 來開啟集群特性。假如你有多個 quartz 例項使用同一套資料庫表時這個屬性必須設定為 true。
org.quartz.jobstore.clustercheckininterval
15000
描述:設定乙個頻度(毫秒),用於例項報告給集群中的其他例項。這會影響到偵測失敗例項的敏捷度。它只用於設定了 isclustered 為 true 的時候。
org.quartz.jobstore.maxmisfirestohandleatatime
20描述:這是 jobstore 能處理的錯過觸發的 trigger 的最大數量。處理太多(超過兩打) 很快會導致資料庫表被鎖定夠長的時間,這樣就妨礙了觸發別的(還未錯過觸發) trigger 執行的效能。
org.quartz.jobstore.dontsetautocommitfalse
false
描述:設定這個引數為 true 則告訴 quartz 不要呼叫從 datasource 獲取到的連線的 setautocommit(false) 方法. 這在少些情況下是有幫助的、例如你有乙個驅動在已是 off 時又呼叫了這個方法會有所抱怨. 這個屬性預設為 false,因為多數驅動需要呼叫 setautocommit(false) 方法。
org.quartz.jobstore.selectwithlocksql
select * from locks where lock_name = ? for update
描述:這必須是乙個從 locks 表查詢一行並對這行記錄加鎖的 sql 語句。假如未設定,預設值就是 select * from locks where lock_name = ? for update,這能在大部分資料庫上工作。 會在執行期間被前面你配置的 table_prefix 所替換。
org.quartz.jobstore.dontsetnonmanagedtx
connectionautocommitfalse
false
描述:這個屬性同 org.quartz.jobstore.dontsetautocommitfalse, 只是它還可以應用於不受管理事物的資料來源(nonmanagedtxdatasource)。
org.quartz.jobstore.txisolationlevelserializable
false
描述:值為 true 時告訴 quartz (當使用 jobstoretx 或 cmt 時) 呼叫 jdbc 連線的 settransactionisolation(connection.transaction_serializable) 方法。這能助於防止某些資料庫在高負荷和長事物時的鎖超時。
org.quartz.jobstore.txisolationlevelreadcommitted
false
描述:當設定為 true 時,這一屬性告訴 quartz 呼叫不受管理的 jdbc 連線的 settransactionisolation(connection.transaction_read_uncommitted) 方法。這能助於防止某些資料庫(如 db2) 在高負荷和長事物時的鎖超時。
譯 Reduce(軟體編寫)(第五部分)
本文講的是 譯 reduce 軟體編寫 第五部分 array.reduce reducer accumulator any,current any any,initialvalue any accumulator any 2,4,6 reduce acc,n acc n,0 12const summ...
Python學習手冊(第五部分 模組)
注意 匯入只發生一次!如果需要乙個模組的 通過某種匯入後再一次執行,需要使用內建函式reload來實現。最好使用import直接匯入模組,使用from import 語句匯入的變數名可能會有問題。import匯入模組包的語句中的目錄路徑只能是以點號間隔的變數。相對匯入與絕對匯入 絕對匯入的格式為 i...
作業系統概念 第五部分 死鎖
概念解釋 計算機存在若干種資源,一任務可能需要若干個資源才能執行完成。如果幾個程序都僅僅保持獲得一部分資源,但都沒有獲得執行完成所需的所有資源,它們都在等待其他程序釋放自己所需的資源,那麼沒有任何乙個程序可以前進 執行完成,這種僵局叫做死鎖。互斥 乙個資源只可以被獨享 占有並等待 程序占有乙個資源不...