2011-11-13 7 views
2

ソケットからデータを受信して​​います。私のServerSocketは新しいリクエストごとに新しいスレッドを作成します。その後、データをMySQLデータベースにアップロードする必要があります。データベース接続と必要な準備済みのすべてのステートメントがあらかじめ作成されています。JDBC同時実行の実装

まあ、私はすべてのリクエストを同時に処理したいと思います。つまり、データベースに複数の接続が必要なのですか?私はプールされた接続を検討していましたが、準備されたstatemensはアプリケーションの起動時に一度だけ作成されなければなりません。

最高のパフォーマンスを実現するには、これを実装する最善の方法は何ですか?

データベースをOracleに置き換えた場合はどうなりますか?いくつかの接続を使用する必要がありますか?彼の本の最初の章のTom Kyteは、Oracleデータベースへの接続を1つだけ使用するように訴えていますが、MS SQLServerはいくつかのデータベースで使用されています。 1つの接続だけを使用して複数のステートメントを実行できるということですか?

+0

アプリケーションのサイズは?大規模なアプリケーションですか? – water

答えて

3

詳しくは、http://en.wikipedia.org/wiki/Connection_poolを参照してください。キャッシュされた接続との接続プールが必要です。プリペアドステートメントをキャッシュし、各ステートメントを実行した後にクリアなパラメータを実行できます。 最高のパフォーマンスを得るには、スレッドプールも新しい要求ごとに新しいスレッドを作成する必要はありません。 準備された文のプールをいくつか作成し、それらをキーで検索することができます(クエリのキーを定義できます)。そのような 何か:

public class StatementPool{ 

    HashMap<String, Queue<Statement>> statementsPoolMap = ... 
    public Statement getStatementByKey(String key){ // you can define keys for queries 

    Queue<Statement> queue = statementsPoolMap.get (key); 
    Statement statement = null; 
    if(queue.isEmpty()){ 
     Statement st = connectionPool.getConnection().prepareStatement(); 
     ... 
    }else{ 
     statement = queue.poll(); 
    } 
    ... 
    return statement 
    } 

} 
+0

接続プールにはプリペアドステートメントもキャッシュされているので、実際に接続プールを使用するだけで済みます(通常、アウトオブボックス再接続のようないくつかの利点があります)。あなたは 'for'ループの中で' getConnection() ' - >' prepareStatement() 'を行い、各反復接続が閉じられずにいくつかのリストに追加された後に、すべての文を事前に準備することができます。ループ全体の後にすべての接続が閉じられ、プールに戻されます。しかし、それはエラーを起こしやすく(プールを使い果たしてしまうなど)、時期尚早の最適化につながる可能性があります。 –

+0

したがって、PreparedStatementは接続と関係がなく、別の接続を使用して実行することができます。 MySQLのアーキテクチャはわかりませんが、Oracleの場合は、SQL文を準備してSGAに保存するだけです。 – dmiandre

+0

接続時にのみステートメントを作成するには、(con.createStatementまたはcon.prepareStatement)および接続に関連するステートメントを呼び出します。 –

0

私は、データベースへの複数の接続が必要であること、という意味ですか?

はい、同時に複数のクライアントにサービスを提供する場合は、データベースに複数の接続が必要です。接続プールを使用して、接続を作成するための高い初期コストを回避することを検討してください。

パフォーマンスに関しては、お客様のアプリケーションのニーズに合わせて最適なアドバイスをご用意しておりますので、ここで詳細をご確認ください。どのような種類のデータがクライアントに渡されますか?大量のデータを頻繁にまたは小さなデータをより頻繁に特定のクライアントに対して実行されたクエリの数クライアントごとにストアドプロシージャまたは挿入/更新クエリを使用していますか?

+0

私は挿入、更新、削除のみを実行します。私はすべてのクエリをアプリケーションの起動時に持っているので、ソケットからの文の値だけを取得します。 – dmiandre