2011-03-13 23 views
2

我正在考慮使用Java的TaskExecutor來啓動異步數據庫寫入。可以理解的線程並不是免費的,但假設我使用的固定線程池大小爲5-10,這是一個壞主意嗎?Java:用於異步數據庫寫入的TaskExecutor?

我們的應用程序使用緩衝區從非常大的文件中讀取數據,並在執行一些數據操作後將此信息刷新到數據庫。在這裏使用異步寫入看起來很理想,以便我們可以繼續處理文件。我錯過了什麼?爲什麼每個應用程序都不使用異步寫入?

回答

2

爲什麼每個應用程序都不使用異步寫入?

以同步方式處理寫入失敗往往是必要/有用/更容易的。

+0

在將數據異步寫入數據庫時​​,處理寫入失敗的一些好方法是什麼?我還在運行時寫入緩存,然後將數據持久保存到數據庫中。我的做法是「以某種方式」堅持在ThreadPoolExecutor中排隊的任務。這有意義嗎?有更好/更簡單的方法嗎? – kapad 2015-07-14 12:48:11

2

我不確定一個線程池是否是必要的。我會考慮使用一個專門的databaseWriter線程,爲你做所有的寫入和錯誤處理。喜歡的東西:

public class AsyncDatabaseWriter implements Runnable { 
    private LinkedBlockingQueue<Data> queue = .... 
    private volatile boolean terminate = false; 

    public void run() { 
     while(!terminate) { 
      Data data = queue.take(); 
      // write to database 
     } 
    } 
    public void ScheduleWrite(Data data) { 
     queue.add(data); 
    } 
} 

我個人看中使用Proxy用於穿線出這可能需要很長的時間的操作風格。我並不是說這種方法比以任何方式使用執行程序更好,只是將其添加爲替代方法。

+0

使用代理時,有沒有什麼好的方法可以將持久性添加到隊列中? – kapad 2015-07-14 12:50:03

-2

爲什麼每個應用程序都不使用異步寫入? - 因爲每個應用程序都做不同的事情。

你能相信一些應用甚至不使用數據庫OMG !!!!!!!!!

認真,雖然你沒有說你的失敗策略是什麼 - 聽起來可能是合理的。如果寫入失敗會發生什麼?或數據庫不知何故

有些數據庫 - 像sybase - 有(或至少有)一個事情,他們真的不喜歡多個作家到一張表 - 所有的作家最終都阻止對方 - 所以也許它實際上不會有太大的區別...

2

想法並不糟糕。其實我昨天只是試了一下,因爲我需要創建一個在線數據庫的副本,它有5個不同的類別,每個類別有60000個項目。

通過移動解析/保存每個類別的操作成並行任務和將每個類別導入到較小的批次並行運行餘減少總進口時間從幾個小時(估計)到26分鐘。一路上我發現了用於分割集合的好的一段代碼:http://www.vogella.de/articles/JavaAlgorithmsPartitionCollection/article.html

我使用ThreadPoolTask​​Executor來運行任務。你的任務只是簡單的實現可調用接口。