2012-04-25 5 views
0

私は自分自身でプログラミングを教えてきました(ここでは、書籍からほとんどがJavaであり、ここで質問を読んでいます)、プログラムは機能しますが、できるだけ速いとは確信できません。私はアプリケーションのプロファイリングを始めました。私のすべてのプログラムの大きな流れは、他のサービス(キューサーバー、データベースサーバーなど)にデータを接続/プル/送信しているようです。多くの接続のためのプログラムを設計するには?

この問題を解決するために人々が従うデザインパターンまたは構造はありますか?データベースからデータを取り出し、結果に何か(例えばresult + 1)して返す単純な問題がある場合、どのようにしてプログラムを構造化し、ほとんどの時間がデータの処理に費やされるか自体?私は、データのポーリングが複雑であることを理解しています。私はこれをやる必要がありますが、これを大規模に行い、データベース/キューサーバーから多くの単純なタスクを実行する必要がある場合はどうしたらいいですか?

私はスレッドを使用する方法を学び、同時にデータを送信する準備ができているスレッドのポーリングを作成しました(私のプログラムは確認応答を待っていませんが)どのようにデータの流入を改善するかを理解するために(私は50のデータ項目に時間を問い合わせます、プログラムはデータを処理するので、CPUはそれを処理できるよりも速く新しいデータをポーリングできません)。また、リクエストごとに接続やチャンネルを再開しないようにしましたが、それでも時間がかかります。

これはよくある問題だと思いますが、誰かが私のプログラム(できればjava)を設計する方法を学ぶことができるリソースを教えてもらえれば分かるでしょう。そのような大きなチャンクが接続に費やされないように/サービスapiのデータを取得します。私は一般的なポインタを探していて、どんな例でもうまくいくでしょう。質問があまりにも一般的で、コードサンプルで簡単に問題を再現できるかどうか教えてください。

ありがとう、うまくいけば私はこれを正しく説明しました。

+1

ORM/JPAフレームワーク、接続プール、キャッシュなどを使用していますか? – mrab

+3

あなたの質問は本質的に「どのように私は高いレイテンシに効果的に対処していますか?それは今、業界で未解決の問題です。明らかに正しい解決策はありません。開発者がこれらの問題を解決するのを支援するために、言語とフレームワークに組み込む必要があるアブストラクションのセットを決定することは非常に困難です。コルーチンの一種をファーストクラスの言語機能にすることで、C#とVBでそうしようとしていますが、これは確かに唯一可能な解決策ではありません。 –

+0

クライアントがデータベースよりも単純に強力で、その側で調整するよりも速くデータを処理できない可能性もあります。 – Affe

答えて

2

接続プーリングを試行しましたか?基本的には、いくつかの接続(たとえば5つ)をプール内で常に開いて準備しておく必要があります。プールから取り出してプールに戻す必要がある場合は、そうすれば、すべての接続オーバーヘッドを処理することはできません。これは、マルチスレッドアプリケーションの場合も同様です。 JDBC接続プーリング用のDBCP、汎用オブジェクトプーリング用のコモンズプール、スレッドプーリング用のThreadPoolExecutor、HTTP接続の「プーリング」(プールよりもキープアライブな再利用)のためのコモンクライアントですらあります。

クライアントがエグゼキュータを使用してデータの永続化が完了するまで待つ必要を回避することもできます。すなわち:

public int inc() { 
    int current = getCurrent(); 
    current++; 
    executorService.execute(new Runnable() { 
     public void run() { 
      dataBase.save(current); 
     } 
    }); 
    return current; 
} 
+0

私は似たようなことをします。私はスレッドをフォークし、各スレッドは接続を共有しますが、システム(この場合はキュー)への独自のチャネルを作成します。その後、50個のアイテムを事前に取得して処理しようとしますが、処理するよりもデータを取得するのに時間がかかるため、キューは常に空で、システムはデータを待たなければなりません。 – Lostsoul

0

パッケージの使用量を減らし(ガーベッジ・コントロールを少なくする)コードを洗練し、スケジューリング・アルゴリズムやJavaの一般的なプロセスのスケジューリングを検討します。一般的に、Javaは低レベルのシステムプロセスにまでは問題があると考えられていますが、Javaで継続したい場合は、おそらく他のプロセスにセマフォとロックを実装することになります。

関連する問題