2012-02-12 56 views
0

我有套接字連接,它將通過databaseQueue.add(message);將數據發送到隊列中。接下來是DatabaseProcessor類,它是在啓動單線程數據庫連接的起始線程中啓動的。連接將繼續通過databaseQueue.take();和進程接收消息。關於這部分的好處就是隻有一個數據庫連接。突然出現數據激增時出現問題。所以另一種方法是對於每個收到的數據我會打開和關閉方法。那麼根據你的重負載體驗,這是去這裏最好的方法嗎?隊列方法或個人數據庫連接?

我的一些代碼片段。

class ConnectionHandler implements Runnable { 
    ConnectionHandler(Socket receivedSocketConn1) { 
     this.receivedSocketConn1=receivedSocketConn1; 
    } 


     // gets data from an inbound connection and queues it for databse update 

     public void run() { 
      databaseQueue.add(message); // put to db queue 

     } 
} 
class DatabaseProcessor implements Runnable { 
public void run() 
     { 
     // open database connection 
     createConnection(); 
      while (true) 
      { 
        message = databaseQueue.take(); // keep taking message from the queue add by connectionhandler and here I will have a number of queries to run in terms of select,insert and updates. 
        } 
     } 

void createConnection() 
{ 
    System.out.println("Crerate Connection"); 
    connCreated = new Date(); 
    try 
    { 
    dbconn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test1?"+"user=user1&password=*******"); 
    dbconn.setAutoCommit(false); 

    } 
    catch(Throwable ex) 
    { 
     ex.printStackTrace(System.out); 
    } 

} 
} 

public void main() 
{ 
new Thread(new DatabaseProcessor()).start(); //calls the DatabaseProcessor 
//initiate the socket 

} 

回答

0

據我瞭解,您正在管理一個客戶端 - 服務器Socket連接,您可以通過隊列發送和接收消息。如果我也是對的,你會爲隊列上的每條新消息創建一個線程。

考慮到將會有大量的消息被髮送和閱讀,我建議您在線程Synchronized中聲明您的方法,以便您在每次收到數據時都不需要打開和關閉流式傳輸(請參閱到你的第二種方法)。同步方法通常是處理同時可由線程修改的常見數據激增的最佳方式。

+0

不,我不爲每條新消息創建新線程我通過主創建一個線程,永遠保持接收消息並傳遞到另一個單獨的線程處理數據庫的東西。那麼我是否仍然需要同步 – user837306 2012-02-13 03:34:08

0

您可以使用連接池獲得兩全其美的:你不侷限於單個線程,你也不必打開每個請求的連接。看看Apache DBCP

+0

因此,使用我的當前線程中只有一個連接的方法是危險的嗎? – user837306 2012-02-13 03:35:00

+0

不,沒有什麼危險的,但如果只使用一個連接,吞吐量將受到限制(取決於您的需求)。 – casablanca 2012-02-13 03:44:56

+0

我已經添加了一些關於我如何做的代碼片段。如何創建更多的數據庫處理器線程會有幫助?根據我目前的設置,你有什麼建議改變? – user837306 2012-02-13 05:09:50

0

這種方法很好。除非您可以使用c3pO創建數據庫池。還可以使用threadPool執行器來維護線程池。

+0

當你說的方法是好的,那麼在我的數據庫處理器現在我調用一個函數來創建一個單一的連接,所以如何創建連接池? – user837306 2012-02-13 03:36:12

+0

我已經添加了我的代碼片段,您如何建議將其更改爲連接池? – user837306 2012-02-13 05:13:49