h2數據庫用於實例的重試模塊
阿新 • • 發佈:2017-06-10
定時 h2數據庫 運行模式 htm new 連接 cal http 本地
(1)服務器模式:
需要額外的開服務器。並且如果不是每個實例對應一個數據庫的話,需要處理多實例重復處理的問題(
獲取的時候帶鎖,然後更新個中間狀態,避免被多個實例同時處理),這種與普通數據庫無區別,額外帶來h2數據庫服務端的維護
(2)內存模式:
1.如果是服務端內存模式,也需要同 (1)一樣的處理
2.如果是嵌入式內存模式。實例關閉,數據就消失了,與map類似。重試數據容易丟失。
(3)嵌入式模式
數據庫的開啟關閉由程序實例控制,不需要額外維護。
實例開閉,數據不會丟失。再次開啟的時候,讀取即可(PS:實例搬家的時候,需要連帶數據文件一起)。
3.重試模塊方案
(1)為啥不用redis/MQ
重試需要間隔,redis,MQ沒法根據時間去選擇已經需要發起重試的請求。如果按順序插入獲取,
可能導致取出的請求還未到期,被重新插入最末端。
(2)使用H2的兩種模式
1.需要重試的數據都存儲到h2
2.定時去h2獲取已經過期的數據(可以處理的),如獲取前1000條,如果本次獲取數據量較大,按id取模分到N個線程處理。
處理成功後,刪除H2數據庫的數據。
缺點:1.依賴h2的穩定與可靠,如果H2出問題,因為是嵌入式,將導致該實例重試模塊異常。
2.H2沒有相關的監控,需要的話,需要自己去開發。
優點:1.基本沒有並發問題,控制簡單。
2.可以通過SQL直接獲取過期的重試。
3.沒個實例都有自己的H2本地數據,不需要考慮多實例並發重復請求並發問題。
歡迎大家對上面提出不足和建議,謝謝。
H2說明(參考http://www.importnew.com/17924.html)
H2有3種運行方式
(1)嵌入式,數據庫為單個文件。
啟動實例的的時候,自動開啟數據庫,數據存儲到單個文件中(連接加上;AUTO_SERVER=TRUE允許多個連接同時存在)。
conntionUrl = jdbc:h2:./TradeLocalDB;AUTO_SERVER=TRUE
(2)內存運行,數據只運行在內存中
1.嵌入式內存模式,實例關閉,數據就丟失了,與map類似。
conntionUrl = jdbc:h2:mem:TradeLocalDB
2. 服務器內存模式,存儲為內存。服務關閉的時候,數據才會丟失,與實例無關。需要對數據庫服務端進行維護
conntionUrl = jdbc:h2:tcp://localhost/mem:TradeLocalDB;DB_CLOSE_DELAY=-1
(3)服務器模式,數據保存在文件中,與普通數據庫類型,服務器關閉,數據不會丟失,不可連接。需要對數據庫服務端進行維護
conntionUrl = jdbc:h2:tcp://localhost/./TradeLocalDB(服務器目錄下)
2.重試模塊選擇H2的運行模式:
(1)服務器模式:
需要額外的開服務器。並且如果不是每個實例對應一個數據庫的話,需要處理多實例重復處理的問題(
獲取的時候帶鎖,然後更新個中間狀態,避免被多個實例同時處理),這種與普通數據庫無區別,額外帶來h2數據庫服務端的維護
(2)內存模式:
1.如果是服務端內存模式,也需要同 (1)一樣的處理
2.如果是嵌入式內存模式。實例關閉,數據就消失了,與map類似。重試數據容易丟失。
(3)嵌入式模式
數據庫的開啟關閉由程序實例控制,不需要額外維護。
實例開閉,數據不會丟失。再次開啟的時候,讀取即可(PS:實例搬家的時候,需要連帶數據文件一起)。
3.重試模塊方案
(1)為啥不用redis/MQ
重試需要間隔,redis,MQ沒法根據時間去選擇已經需要發起重試的請求。如果按順序插入獲取,
可能導致取出的請求還未到期,被重新插入最末端。
(2)使用H2的兩種模式
1.需要重試的數據都存儲到h2
2.定時去h2獲取已經過期的數據(可以處理的),如獲取前1000條,如果本次獲取數據量較大,按id取模分到N個線程處理。
處理成功後,刪除H2數據庫的數據。
缺點:1.依賴h2的穩定與可靠,如果H2出問題,因為是嵌入式,將導致該實例重試模塊異常。
2.H2沒有相關的監控,需要的話,需要自己去開發。
優點:1.基本沒有並發問題,控制簡單。
2.可以通過SQL直接獲取過期的重試。
3.沒個實例都有自己的H2本地數據,不需要考慮多實例並發重復請求並發問題。
歡迎大家對上面提出不足和建議,謝謝。
h2數據庫用於實例的重試模塊