2012-02-12 5 views
0

私はdatabaseQueue.add(message);を経由してキューにデータを送信するソケット接続を持っています。次に、DatabaseProcessorクラスは、開始時にスレッドとして開始され、単一のデータベース接続が行われます。接続はdatabaseQueue.take();でメッセージを受け取り、処理します。この部分の良い点は、データベース接続が1つしかないことです。突発的にデータが急増しているときに問題が発生します。もう一つの方法は、受け取った各データに対して、私はメソッドを開いて閉じます。ここに行く最善の方法である重い荷物のためのあなたの経験に基づいていますか?キュー方式または個別DB接続?

私のコードの一部抜粋。

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

あなたがキューを介してメッセージを送受信するクライアント - サーバーソケット接続を管理していることは理解できます。私もそれが正しいとすれば、キュー上の新しいメッセージごとにスレッドを作成しています。

多くのメッセージが送信され、読み込まれることを考慮して、スレッドSynchronizedにメソッドを宣言することをお勧めします。データを受信するたびにストリームを開いたり閉じたりする必要はありません。あなたの2番目のアプローチへ)。同期メソッドは通常、スレッドによって同時に変更できる共通データのサージを処理するための最良の方法です。

+0

いいえ、私は私が今までのメッセージを受信し続けるとDBのものを扱う別の別のスレッドに渡すために残っている主な経由でスレッドを1つ作成し、それぞれの新しいメッセージのための新しいスレッドを作成しないでください。だから私はまだ同期が必要なのですか? – user837306

0

あなたは両方の長所を取得するには、接続プーリングを使用することができます:あなたは、単一のスレッドに限定されるものではなく、あなたはまた、要求ごとに接続を開く必要はありません。 Apache DBCPをご覧ください。

+0

スレッド内のただ1つの接続の私の現在のメソッドを使用するのは危険ですか? – user837306

+0

いいえ何も危険はありませんが、接続を1つだけ使用すると、スループットは制限されます(必要に応じて)。 – casablanca

+0

私はそれをどうやって行っているのか、いくつかのコードスニペットを追加しました。より多くのデータベースプロセッサスレッドを作成すると役に立つでしょうか?私の現在の設定に基づいて、あなたは何を変えることを提案しますか? – user837306

0

このアプローチは罰金です。あなたはc3poを使用してDBプールを作成することができます。また、スレッドプールを管理するために、threadPoolエグゼキュータを使用してください。

+0

あなたはアプローチがうまくいけば私のデータベースプロセッサで今私は1つの単一の接続を作成するためにどのように接続プールを作成する1つの関数を呼び出すと言う? – user837306

+0

自分のコードのスニペットを追加しました。接続プールに変更するにはどうすればよいですか? – user837306

関連する問題