2017-11-22 4 views
0

サーブレットのdoGetメソッドの中で、JPA TypedQueryを使用してデータを取得しています。私は、http get requestメソッドを通して必要なデータを取得することができます。データを取得する方法にはおよそ10秒かかりますが、1回のリクエストですべてのデータが良好です。この問題は、同時に複数のリクエストが発生した場合に発生します。 4つのリクエストを同時に行うと、4つのクエリーがまとめて処理され、すべてのクエリーが返されるまでに40秒かかります。 JPAに4つの別々のクエリを並行して実行させるにはどうすればよいですか? persistence.xmlにこれが設定されている必要がありますか、それともコードに関連する問題ですか?
注:私はこのコードをスレッドで実行しようとしました。
私の理解を深めるためのリンクといくつかの適切な用語が理解できます。JPA/Entity Managerでパラレル問合せを作成して1つのバッチにまとめる方法を教えてください。

ありがとうございます!

try{ 
    String sequenceNo = request.getParameter("sequenceNo"); 
    EntityManagrFactory emf = Persistence.createEntityManagerFactory("mydbcon"); 
    EntityManager em = emf.createEntityManager(); 
    long startTime = System.currentTimeMillis(); 
    List<Myeo> returnData = methodToGetData(em); 
    System.out.println(sequenceNo + " " + (System.currentTimeMillis() - startTime)); 
    String myJson = new Gson().toJson(returnData); 
    resp.getOutputStream().print(myJson); 
    resp.getOutputStream().flush(); 
}finally{ 
    resp.getOutputStream().close(); 
    if (em.isOpen()) 
      em.close(); 
}     

4 simulaneous要求試料
はlocalhost /がmyservlet/mycodeblock?sequenceNo = A
はlocalhost /がmyservlet/mycodeblock?sequenceNo = B
はlocalhost /がmyservlet/mycodeblock?sequenceNo = C
はlocalhost /がmyservlet/mycodeblock?sequenceNo = D

得られた印刷文
B 38344
C 38785
D 39065

私が何をしたいです
B 9344
C 9785
あなたは、4つの別々のGET-リクエストを行う場合、これらの要求がで呼ばれるべき10065

答えて

0

D平行。彼らは別々の取引で呼ばれているので、一緒にまとめてはいけません。

これが機能しない場合は、dbmsへの呼び出しをシリアル化するdatabase-connection-pool-sizeまたはservlet-thread-pool-sizeを定義しているかどうかを確認する必要があります。

+0

ご指摘ありがとうございます。私はしばらくの間別のプロジェクトに指揮されていたので、返信を忘れてしまった。私の問題はあなたの2番目のポイントにあると確信しています。私がこれに戻って問題を解決すると、私はあなたに答えを与えるだろうと思う。 – FCoffee

関連する問題