企業のニーズ、現在のインポートExcelの機能、プロセスは、次のとおりです。、Excelのデータを読み取る輸入要件かどうかを判断するためのデータのすべての部分のバックグラウンドチェックを渡し、フロント、輸入プレビューショーに戻ります。(応答するための遠位待ち、難しいです)。ユーザーは、[インポート]ボタン、非同期インポートを(フロントエンド行う方が良い、待っていない)をクリックします。現在のデータインタフェースは現在、3000のデータをサポートするために私を必要とし、唯一の300をサポートしています。
問題解決、批判的思考です。
まず、データが300より大きい場合、判断を参照してください、読書テーブルの場所を見つけ、界面での直接のリターンを見て。3000に300を入れてください。
そして、データのチェックサム分析をインポートし、データチェックが何であるか、データがデータベースからです。データベースクエリからのたびに、それは確かに遅いです。でも、Redisのクエリキャッシュ、だけでなく、ネットワークの消費量は、キャッシュの圧力を高めます。スタンドアローンありますがRedisのクエリパフォーマンス120 000回/秒、この劇は、それがシステムを使用して40人の崩壊を引き起こした場合120 000 3000は、40で割りました。同じデータが、3000をチェックする必要があり、それは愚かではないでしょうか???だから、データベースクエリにすべてのクエリを削減することは、一度だけ最後までメソッド呼び出しをチェックし、検索操作の重複を避けるために、この方法では同時実行セーフコンテナのConcurrentHashMapストアのデータを、Redisのキャッシュ、Redisのデータで見つかったキャッシュを追加作成します。
メソッド内で作成されたオブジェクトは、メソッドの呼び出しが完了すると、スタックをプッシュし、あなたの参照を解放し、それがメモリを解放します。3000における検証のプロセスでは、オブジェクトオブジェクトは、JVMメモリに迅速にかなり再度データベースまたはキャッシュから取得する必要性よりも、再利用することが容易です。これは、スタックレベルのキャッシュ、JVMのキャッシュ、ローカルキャッシュ方法です。
これは考えて、最も重要な考え方です。この方法を達成するために、クエリのできるだけ少ない、クエリ結果を再利用します。
私は、データキャッシュの方法でのConcurrentHashMapを行っていたとき、彼らはテストしました。
結果:800データのインポートチェックをサポートします。先端が10秒以上を要求し、要求がタイムアウトします。
どのようにそれを行うには???
製品、あなたは需要ああを扱うことができません。ああ達成することはできません。。。。。。で口論。。。。。無効口論。
次に使うマルチスレッド最適化技術を。
1.スレッド・プールを作成します。
2.取得結果を容易にするために、順序付けられたセットの戻り値を受信するためのスレッドプールのタスクを作成します。
3.スレッドプールを取得します。
4.読むExcelスプレッドシートデータ、各列を通して、マルチスレッドタスクに提出されたデータの各行。
トラバーサルfutureListの取得結果。
6.このように、すべての結果の組み合わせが返されます。転換のこの方法を使用してスレッドプールを完了します。
7.この時点で、問題は、3000件のデータを浮上している、各データは、IDを持って、どのように複数のスレッド、処理されたIDは繰り返さないようにしましょう、重複はそれをマークすることができますか???
今回は私が同時のセキュリティ設定を使用===> ConcurrentSkipListSetの
ソースConcurrentSkipListSetのadd()メソッドを見てみましょう:
Googleと上記の説明翻訳:
指定された要素が存在しない場合は、このコレクションに追加します。
場合は、より正式には、指定された要素{@code eは}このセットに追加された
セットは{@codeのe.equals(E2)}の要素{@codeのE2}を含んでいません。
セットがすでに要素が含まれている場合、呼び出しはセットを終了します
変わらず、リターンは{偽} @code
ここで説明id我々は大量使用が完全に正しいことを行きます。
私たちは、get()メソッドのソースコードの未来を見てみましょう:
翻訳:する計算のために待機し、必要に応じて 。完成した後、その結果を取得しますが、
必要な計算が完了するのを待ってから、結果を取得
だから、将来のget()メソッドを待ってブロックされています。
これは、私が最適化されたデータ、データに応じてデータ300、800〜10秒の先頭から7〜3000秒の応答を行っています。
タスクを完了するだけでなく、パフォーマンスが向上します。
この時点で、スレッド・プール、今後、呼び出し可能なセキュリティおよび同時コンテナクラスのConcurrentHashMap、ConcurrentSkipListSetの技術を使用して、
大幅に私のマルチスレッド、並行プログラミング手法を改善しました。思考の飛躍であるレベルのデータキャッシュ、JVMのキャッシュを、スタックの方法があります。