2011-03-31 126 views
3

我們正在開發一種車輛跟蹤系統,其中幾個GPS設備使用TCP連接不斷向服務器發送GPS位置。 TCP通信器解碼GPS位置並將該數據插入數據庫。現在,TCP通信器的一個線程提供一個設備請求。解碼GPS數據後,它會創建與數據庫的連接並插入數據並釋放連接。 隨着設備數量的增加,到數據庫(即MySQL)的併發連接數量也在增加。因此,我想實現一個隊列,其中每個TCP通信線程將數據推送到一端,一個作業將從另一端接收數據並將其保存到數據庫中。將數據插入到數據庫中實現隊列

有人可以建議我處理這一切的最佳解決方案嗎?我們的應用程序基於Java,數據庫是MySQL。

感謝, SAURABH

+0

呃...消息隊列。 – Lazarus 2011-03-31 11:52:30

回答

2

你可以只創建一個簡單的Thread處理該數據庫寫入。然後讓你的通信器線程對需要寫入的數據進行排隊。事情是這樣的:

public class DatabaseQueue extends Thread { 
    private LinkedBlockingQueue<Data> queue = new LinkedBlockingQueue<Data>(); 

    public void queueData(Data data) { 
     queue.add(data); 
    } 

    public void run() { 
     while (true) { 
      Data data = queue.take(); 
      // write data to database 
     } 
    } 
} 
1

一個普通的併發隊列是最好的,如果你要的批生產數據,並支持簡單的配料技術(以及爲此數據庫插入性能)

但是,如果你想有一個更靈活的方法做其他事情也是使用具有固定數量的線程的ExecutorService。通過這種方式,您可以添加任務來執行任何操作,達到有限程度的併發。

0

一個作業將另一端 獲取數據,然後把它插入到數據庫 。

的ConcurrentLinkedQueue只是一個矯枉過正,它是一個多線程訪問鎖free.The poll方法冒不必要的睡眠時間間隔,也ü需要等到隊列被填滿,再另一種睡眠。 如果你只有一個線程將東西放入隊列,而另一個線程取東西從隊列中

Queue<GPRSObj> queue = Collections.synchronizedList(new LinkedList<GPRSObj>()); 

LinkedBlockingQueue