2017-10-05 97 views
1

我有一個java項目打包成一個jar和運行。代碼與2個數據庫,主數據庫和輔助數據庫進行交互。表X存在於具有相同結構的主DB和輔DB中。清理線程/後臺線程或過程/服務在Java

代碼中的Java線程使用鏈接的阻塞隊列,並且添加到主隊列中的表X上運行的每個DML查詢的此隊列中。線程繼續檢查隊列是否添加了新的DML查詢對象,並在輔助數據庫上執行相同操作。

一天結束時,需要刪除表X中給定日期的所有行,但在此之前,我們需要在兩個數據庫中調整表X,並且在行數不匹配的情況下,首先將缺少的行插入到次級DB,然後從主數據庫中刪除。

這裏我面臨兩個問題:

第一個問題是,作爲添加到所述隊列的增加DML查詢的數量,這些查詢的執行速度變慢。

其次,如果jar停止並再次重新啓動,添加到隊列中但尚未執行的DML查詢會因爲隊列在內存中而丟失,因此這些行永遠不會移動到輔助數據庫。

我在尋找的是一種方法,我可以設計一個後臺服務或一個外部服務,它可以獨立於主jar運行還是停止運行,並且可以繼續執行復制DML查詢的工作從主數據庫到輔助數據庫。

+0

像Linux或Windows上的'cron''Task Scheduler'? –

回答

0

我有這個想法,既可以作爲補充或替代後臺服務來完成:

假設你的數據庫操作不是插入的小DB簡單的字符串重得多,你可以插入查詢以純文本格式存儲在數據庫中,並在執行時將其刪除。這樣,如果任何事情崩潰,你可以恢復查詢隊列的位置。本身成爲持續性的隊列......我們可以有這樣的事情:

查詢生成器>查詢數據庫>查詢執行服務>最終DB

其次,你說「作爲添加到隊列DML的查詢數增加,這些查詢的執行變得緩慢「。你的查詢隊列如何變得沉重?也許你應該檢查可能的內存泄漏。