1. 程式人生 > >h2數據庫用於實例的重試模塊

h2數據庫用於實例的重試模塊

定時 h2數據庫 運行模式 htm new 連接 cal http 本地

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數據庫用於實例的重試模塊