2012-03-06 71 views
0

這將是我的第一個多線程應用程序,如果它可以像這樣開發的話。所以我需要一些幫助入門。在Java中開發多線程應用程序

我現在有一個很完善

  1. 從源數據庫獲取數據,並將其轉換爲對象以下Java程序(POJO)中
  2. 從目標數據庫獲取數據,並將其轉換爲對象( POJO)中。
  3. 比較源對象和目標對象,如果存在差異,則使用來自源數據庫的信息更新目標數據庫。

現在我的需求發生了變化,我需要使用3個不同的目標數據庫(TargetDB1,TargetDB2,TargetDB3)。每個人都有不同的連接信息。

我的問題是,我們能否讓這個多線程應用程序,其中在

線程1將得到

線程2將得到TargetDB1對象,比較源對象(從線程1獲得)源對象並更新TargetDB1在與源對象不同的情況下

線程3將得到TargetDB2對象,比較源對象(從線程1中獲得)和在與所述源對象不同的情況下更新所述TargetDB2

線程4將獲得TargetDB2對象,與源對象(從線程1獲得)進行比較,並在源對象不同時更新TargetDB2

如果這可以作爲多線程應用程序開發,那麼怎麼去關於它。

+3

您確定要通過應用程序層執行此操作嗎?對於大容量,使用數據庫實用程序會更快。即使簡單地使用一些SQL語句和.csv也可能會更快。 – 2012-03-06 16:27:56

+0

我不確定這是否是讓dbs同步的最佳方式。如果您的DB1是主數據庫,那麼最好在我看來爲其他數據庫編寫升級腳本。 – FourOfAKind 2012-03-06 16:30:50

+0

我不會使用多個線程,但我會關心一致性。例如比如說DB1,2和3是不同的。一次只比較兩個數據庫,您需要確保所有三個數據庫都以相同的值結束。 – 2012-03-06 16:45:25

回答

1

我會爲您的每個目標數據庫使用一些BlockingQueue(如LinkedBlockingQueue)創建一個工作隊列。生產者線程將從源數據庫獲取對象,然後將其添加到每個工作隊列中。然後,連接到目標數據庫的每個線程都可以從其工作隊列中出列並以其自己的速度更新其數據庫。

源數據庫線程可能看起來像:

// allow only 10 outstanding objects to be in the work queue before it blocks 
queue1 = new LinkedBlockingQueue<SourceObject>(10); 
new Thread(new TargetDatabaseThread("url-to-database1", queue1)).start(); 
queue2 = new LinkedBlockingQueue<SourceObject>(10); 
new Thread(new TargetDatabaseThread("url-to-database2", queue2)).start(); 
queue3 = new LinkedBlockingQueue<SourceObject>(10); 
new Thread(new TargetDatabaseThread("url-to-database3", queue3)).start(); 
while (true) { 
    SourceObject sourceObj = getFromSourceDatabase(); 
    // this might block if you set a capacity on your queue and it was full 
    queue1.put(sourceObj); 
    queue2.put(sourceObj); 
    queue3.put(sourceObj); 
} 

每個目標數據庫的線程則可能是:

有這位模特
public class TargetDatabaseThread implements Runnable { 
    private final String jdbcUrl; 
    private final BlockingQueue queue; 
    private volatile boolean shutdown; 
    public TargetDatabaseThread(String jdbcUrl, BlockingQueue queue) { 
     this.jdbcUrl = jdbcUrl; 
     this.queue = queue; 
    } 
    public void run() { 
     // maybe some initialization, make database connection, etc. 
     while (!shutdown) { 
      // this would block if nothing is in the queue 
      SourceObject sourceObj = queue.take(); 
      SourceObject targetObj = 
       getObjectFromTargetDatabase(sourceObj.getId()); 
      if (updateTarget(sourceObj, targetObj)) { 
       updateMyTargetObjectInDatabase(targetObj); 
      } 
     } 
    } 
} 

的一個問題是,如果目標數據庫線程需要以任何方式更新源對象。如果是這種情況,那麼你將不得不同步對象。

請注意,可以使用容量設置阻塞隊列。如果生產者從源數據庫讀取數據比從目標數據庫寫入者更新其數據庫更容易,這將非常有用。您不希望隊列填充內存,因爲目標數據庫很慢。

+0

@加里..感謝您的答覆..我不需要更新源數據庫。感謝代碼片段。既然這是我第一次,你能否詳細說明一下代碼。目前我有大量的類有很多方法來處理整個抓取,比較,更新前的衝突檢查,更新(刪除和插入)操作。我如何使用它們,以便不同的線程將使用相同的程序。實質上,這些線程類是如何看起來的以及它們如何在主要方法中執行。 – Raghu 2012-03-06 16:36:24

+0

你所有的線程都會使用相同的'ConflictCheck'等方法。也許把它叫做TargetDatabaseThread或者其他的。其構造函數的一個參數是'BlockingQueue',它們將調用'take()'。 – Gray 2012-03-06 16:41:07

+0

我已經編輯了我的答案@拉胡。祝你好運。 – Gray 2012-03-06 16:49:39