2016-10-12 19 views
1

これは私が実際の解決策を見つけることなく、ほぼ1週間対処しようとしてきた問題です。ここに問題があります。私の角度クライアント側のJava RESTサービスの応答に時間がかかりすぎる

私はこのように動作するCSVファイルを生成するためのボタンがあります。

  1. ユーザーがボタンをクリックします。
  2. POST要求がREST JAX-RS Webサービスに送信されます。
  3. Webサービスはデータベースクエリを起動し、クライアントに必要なすべての行を含むJSONを返します。
  4. AngularJSクライアントはJSONを受信して​​それを処理し、CSVを生成します。 、問題は、私はJBOSSサーバのように落ちた2000行から.Startingデータの大きな金額を返却する必要があり、私のようにデータを送信するために闘争を開始したときに開始返すようにデータの低ボリュームがあるときここ

すべての良いですデータ容量の一定の限界に達しました(サーバーが稼動している私の日食はデータ伝送の終わりまで非常に遅くなります)。 問題は、テストの結果、データベースクエリではなく、デベロッパー設定でANGULARクライアントとJBOSSサーバーの両方が同じマシン上で実行されていても、時間がかかりますがデータの送信(サイズが2MBの3000行はクライアントに到達するのに約1分かかります)。 これは私のサーバー側のコードです:

@POST 
@GZIP 
@Path("/{id_user}/transactionsCsv") 
@Produces(MediaType.APPLICATION_JSON) 
@ApiOperation(value = "Transactions de l'utilisateur connecté sous forme CSV", response = TransactionDTO.class, responseContainer = "List") 
@RolesAllowed(value = SecurityRoles.PORTAIL_ACTIVITE_RUBRIQUE) 

public Response getOperationsCsv(@PathParam("id_user") long id_user, 
           @Context HttpServletRequest request, 
           @Context HttpServletResponse response, 
           final TransactionFiltreDTO filtre) throws IOException {  
    final UtilisateurSession utilisateur = (UtilisateurSession) request.getSession().getAttribute(UtilisateurSession.SESSION_CLE); 
    if (!utilisateur.getId().equals(id_user)) { 
     return genererReponse(new ResultDTO(Status.UNAUTHORIZED, null, null)); 
    } 
    //database query 
    transactionDAO.getTransactionsDetailLimite(utilisateur.getId(), filtre); 
    //database query 
    List<Transaction> resultat = detailTransactionDAO.getTransactionsByUtilisateurId(utilisateur.getId(), filtre); 
    // To format the list to the export format 
    List<TransactionDTO> liste = Lists.transform(resultat, TransactionDTO.transactionToDTO); 
    return Response.ok(liste).build();  
} 

は、あなたたちはこの問題を引き起こしているかについてどんな考えを持っているか、この問題が発生しない場合がありますことを行うための別の方法を知っていますか?私は感謝されます 。 ありがとう:)

をここでJBOSSスレッドダンプのためのリンクです: http://freetexthost.com/y4kpwbdp1x

+0

実際にペイロード(2MBのデータ転送)になる可能性があります。コンテンツをエンコードするヘッダーとともにサーバーから送信する前に、コンテンツをgzipでエンコードしようとすることができます。 –

+1

既に試したことがありますが、2 Mbからのデータは80 Kバイトになりましたが、圧縮されていないほど遅いです –

+0

問題はサーバー側にあると確信していますか?タイミングを測定しましたか?カール、サーバーの応答のJavaScript処理が問題ではないことを確認するには?エンドポイントの名前がtransactionsCsvの場合、サーバーでJSONが生成されるのはなぜですか? CSVはどこで生成されていますか? –

答えて

0

私はより多くの地元のあなたがあることを他のコンテキスト(RMIを使用して)で見つけた、あまり価値が圧縮があります。あなたのマシンは、おそらく、圧縮と圧縮解除に必要な処理作業の大部分を失っているでしょう。データの量が多いほど、ここでの損失は大きくなります。

これを1つのリストとして送信する必要が本当にない場合は、エントリのリストを送信することを検討することもできます。 1つの応答で送信されるデータの量を減らすようにページ単位で要求します。クライアント側で本当に単一のリストが必要な場合でも、トランスポート後にアセンブルできます。

+1

これは、私が考えてきた解決策の1つです。クライアントにチャンクされた応答を送信します。私はそれに疲れましたが、私のサービスで私の場合にそれを動作させる方法についての手がかりはありません。それ? –

+0

ステートレスなアプローチは、リクエストのページ(ページ番号とページサイズ)をクエリパラメータにすることです。これらのパラメータを使用して、リストのそのように指定された部分を返します。このアプローチの欠点は、要求間でデータが変更された場合、エントリを失うか、またはその倍増する可能性があるということです。 ステートフルなアプローチもあります。POST関数を使用して検索結果のリソースを作成し、DELETEで解放されるまで(または期限切れになるまで)検索結果を保持します。次にそれについてのページ。この方法では、途中で検索結果が変わることはありません。 –

0

パフォーマンスを測定するには、完全なトレースを確認する必要があります。

これを行うには多くの方法がありますが、それは簡単な方法の1つです。

  1. 出力をZIPに圧縮すると、ネットワーク上のデータ転送が減少します。
  2. クエリの実行時間が短縮されるように、データベースの列をインデックスします。
  3. 複数のモジュール間の処理時間を確認する(REST - > Service - > DAO - > DB、またはその逆)
  4. データベースに大きな変更がなければ、セカンダリキャッシングメカニズムを使用し、キャッシュエビクション時間を短縮するか、必要に応じてキャッシュエビクションポリシーを優先します。

正確な理由を見つけるために:process.Fromそのスレッドダンプの単一の実行からスレッドダンプを収集

を、我々は層の正確な時間の消費量をチェックし、問題を特定することができます。

希望に役立ちます!

[EDIT]

あなたがリンクに追加1ダンプにスタックトレースを分析してはいけません。

データの大部分は、要求によって処理できない場合には、

  1. ページネーションは、ページ数とページサイズは
  2. リミット、数(のみ非CSVファイルの場合)に役立つかもしれません処理できるラインの数。日付、ユーザーなどのよう
  3. 追加のクエリ条件

サンプルRESTのURL:

http://localhost:8080/App/{id_user}/transactionCSV?limit=1000 

http://localhost:8080/App/{id_user}/transactionCSV?fromDate=2011-08-01&toDate=2016-08-01 

http://localhost:8080/App/{id_user}/transactionCSV?user=Admin 
+0

サービスを実行中にローカルJBOSSプロセス(私のアプリケーションが実行されている場所)のスレッドダンプを生成する必要がありますか? –

+0

はい、JVisualVMなどのツールを使ってプロセスを確認できます – VinayVeluri

+0

JVisualVMで生成されたスレッドダンプのリンクを追加しました –

0

私は問題が一度にデータの大きな量を送信しようとしているサーバーから来ていることを確信しています。一つの大きなものの代わりにいくつかの小さなチャンクでhttpの答えを送ることができる方法はありますか?

関連する問題