ローカル インターフェイスを介してセッション Bean を呼び出すサーブレットがあります。セッション メソッドの最後のステートメントと、サーブレットでのそのメソッド呼び出しに続くステートメントの間に 3 秒間の一時停止があります。
セッション Bean 内のどのステートメントがメソッドのリターン時に余分な遅延を引き起こしているかを特定しましたが、そのような一時停止が発生する理由と何が起こっているのかわかりません。
セッション Bean メソッド:
public void getXMLByDatesPlCtry(PrintWriter out, Date dateStart, Date dateEnd, int plId, String ctry) throws ParserConfigurationException {
Query findCtry = em.createNamedQuery("Ctry.findByCtry");
findCtry.setParameter("ctry", ctry);
Ctry country = (Ctry) findCtry.getSingleResult();
findByDatesPlFcIds = em.createNamedQuery("SortTypeInv.findByDatesPlCtry");
findByDatesPlFcIds.setParameter("dateStart", dateStart);
findByDatesPlFcIds.setParameter("dateEnd", dateEnd);
findByDatesPlFcIds.setParameter("plId", plId);
findByDatesPlFcIds.setParameter("ctry", country);
inventoryList = findByDatesPlFcIds.getResultList(); // statement causing pain
logger.warning("about to return");
}
セッション Bean を呼び出すサーブレット:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
[...]
sortTypeInvFacade.getXMLByDatesPlCtry(out, lastSunday.getTime(), yesterday.getTime(), pl_id, request.getParameter("ctry"));
Logger.getLogger(InventoryServlet.class.getName()).warning("just received");
} catch (ParserConfigurationException ex) {
Logger.getLogger(InventoryServlet.class.getName()).log(Level.SEVERE, null, ex);
} finally {
out.close();
}
}
したがって、セッション Bean の「返そうとしている」ログ メッセージとサーブレットの「受信したばかり」のログ メッセージの間に 3 秒間の一時停止が発生します。ある段階で罪を犯すステートメント (コレクションへのデータの収集) が呼び出された場合にのみ、長い一時停止が行われます。本当に驚くべきことは、無駄な時間がコレクションの構築ではなく、メソッドが返されたときに費やされていることです。この場合、メソッドからは何も返されません。
コレクションがセッション クラスのプライベート変数であろうとローカル変数であろうと、何も変わりません。セッション Bean をステートフルまたはステートレスにする場合も同様です。
何が起こっている?その長い一時停止をどのように回避できますか?