質問編集履歴

3 ソースコードへ追記しました。

itmsd

itmsd score 16

2016/09/06 11:19  投稿

サーブレットから動的に作成したCSVを遅延なく記録させたい。
###前提・実現したいこと
サーブレットでCSVを作成させて遅延なくハードディスクへ記録させたいと思います。
###発生している問題・エラーメッセージ
サーブレットを実行し、CSVを作成するのですが、実際にハードディスクに記録
されるまでに5秒程度の遅延が発生しています。
上記と同じことを、jdk1.4とtomcat3の組み合わせで実行しているときは、問題
なく運用できておりましたが、jdk8とtomcat8の環境に変えてから上記の問題が
発生するようになりました。
ソースコード問題、tomcat等の設定でお気づきの点がございましたら、
ご教示いただければ、幸甚にぞんじます。
###該当のソースコード
 
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
   doAction(request, response);  
}  
 
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
 doAction(request, response);  
}  
 
private void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 HttpSession session = request.getSession(true);
 response.setHeader("Cache-Control", "no-cache");
 response.setHeader("Pragma","no-cache");
 request.setCharacterEncoding("UTF-8");
 /*途中省略*/
 synchronized (session) {
   sc_ = getServletConfig().getServletContext();
   connPool_ = (ConnectionPool)sc_.getAttribute("connPool");
   loginUser = (SysUserBeans)session.getAttribute("loginUser");
   String sceneStr = request.getParameter("scene");
   int scene = -1;
   if (sceneStr != null) scene = Integer.parseInt(sceneStr);
   switch(scene) {
     case 1: // 一覧
       response.setContentType(CONTENT_TYPE);
       showRows(request, response, session);
       break;
 /*途中省略*/
     case 22: // CSV作成
       downloadCSV(request, response, session);
       break;
     default: // 検索条件
       response.setContentType(CONTENT_TYPE);
       sc_.getRequestDispatcher("/view/sales/salesAggregateFrame.jsp").forward(request, response);
   }
   rows.setReqPrintUrl(null);
 }
}
 private void downloadCSV(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws ServletException, IOException {
   SalesAggregateBeans rows = (SalesAggregateBeans)session.getAttribute("salesAggregate");
   SysUserBeans loginUser = (SysUserBeans)session.getAttribute("loginUser");
   String fileName;
   fileName = sc_.getRealPath("/data/210.csv");
   rows.setReqPrintUrl(response.encodeURL("/example/data/.csv"));
   FileOutputStream fo = new FileOutputStream(fileName);
   OutputStreamWriter ps = new OutputStreamWriter(fo, "SJIS");
   int iMax = rows.getSize();
   for (int i = 0; i < iMax; i++) {
     rows.getRow(i);
     ps.write("\"" + rows.getCd() + "\",\"");
     ps.write(rows.getName() + "\",\"");
     ps.write(rows.getAddress() + "\",\"");
     ps.write(rows.getReadings() + "\",\"");
     ps.write(rows.getSalesmanName() + "\",");
     ps.write(rows.getCarryOver() + ",");
     ps.write(rows.getSum(0) + ",");
     ps.write(rows.getSum(1) + ",");
     ps.write(rows.getSum(2) + ",");
     ps.write(rows.getBalance());
     ps.flush();
   }
   ps.close();
   ps = null;
   fo.close();
   fo = null;
   sc_.getRequestDispatcher("/view/sales/salesAggregate.jsp").forward(request, response);
 }
###試したこと
CSVの出力件数は、わずか5行でも、100行程度でも、5秒程度の遅延が発生しています。
###補足情報(言語/FW/ツール等のバージョンなど)
・Windows10
・jdk8
・tomcat8
(サーブレットの設定は、インストール直後の状態です。)
  • Java

    24148 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Tomcat

    903 questions

    TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

2 ソースコードを追加しました。

itmsd

itmsd score 16

2016/09/06 10:04  投稿

サーブレットから動的に作成したCSVを遅延なく記録させたい。
###前提・実現したいこと
サーブレットでCSVを作成させて遅延なくハードディスクへ記録させたいと思います。
###発生している問題・エラーメッセージ
サーブレットを実行し、CSVを作成するのですが、実際にハードディスクに記録
されるまでに5秒程度の遅延が発生しています。
上記と同じことを、jdk1.4とtomcat3の組み合わせで実行しているときは、問題
なく運用できておりましたが、jdk8とtomcat8の環境に変えてから上記の問題が
発生するようになりました。
ソースコード問題、tomcat等の設定でお気づきの点がございましたら、
ご教示いただければ、幸甚にぞんじます。
###該当のソースコード
private void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
 HttpSession session = request.getSession(true);  
 response.setHeader("Cache-Control", "no-cache");  
 response.setHeader("Pragma","no-cache");  
 request.setCharacterEncoding("UTF-8");  
 
 /*途中省略*/  
 
 synchronized (session) {  
   sc_ = getServletConfig().getServletContext();  
   connPool_ = (ConnectionPool)sc_.getAttribute("connPool");  
   loginUser = (SysUserBeans)session.getAttribute("loginUser");  
 
   String sceneStr = request.getParameter("scene");  
   int scene = -1;  
   if (sceneStr != null) scene = Integer.parseInt(sceneStr);  
   switch(scene) {  
     case 1: // 一覧  
       response.setContentType(CONTENT_TYPE);  
       showRows(request, response, session);  
       break;  
 
 /*途中省略*/  
 
     case 22: // CSV作成  
       downloadCSV(request, response, session);  
       break;  
 
     default: // 検索条件  
       response.setContentType(CONTENT_TYPE);  
       sc_.getRequestDispatcher("/view/sales/salesAggregateFrame.jsp").forward(request, response);  
   }  
   rows.setReqPrintUrl(null);  
 }  
}  
 
 private void downloadCSV(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws ServletException, IOException {
   SalesAggregateBeans rows = (SalesAggregateBeans)session.getAttribute("salesAggregate");
   SysUserBeans loginUser = (SysUserBeans)session.getAttribute("loginUser");
   String fileName;
   fileName = sc_.getRealPath("/data/210.csv");
   rows.setReqPrintUrl(response.encodeURL("/example/data/.csv"));
   FileOutputStream fo = new FileOutputStream(fileName);
   OutputStreamWriter ps = new OutputStreamWriter(fo, "SJIS");
   int iMax = rows.getSize();
   for (int i = 0; i < iMax; i++) {
     rows.getRow(i);
     ps.write("\"" + rows.getCd() + "\",\"");
     ps.write(rows.getName() + "\",\"");
     ps.write(rows.getAddress() + "\",\"");
     ps.write(rows.getReadings() + "\",\"");
     ps.write(rows.getSalesmanName() + "\",");
     ps.write(rows.getCarryOver() + ",");
     ps.write(rows.getSum(0) + ",");
     ps.write(rows.getSum(1) + ",");
     ps.write(rows.getSum(2) + ",");
     ps.write(rows.getBalance());
     ps.flush();  
   }
   ps.close();
   ps = null;
   fo.close();
   fo = null;
   sc_.getRequestDispatcher("/view/sales/salesAggregate.jsp").forward(request, response);
 }
###試したこと
CSVの出力件数は、わずか5行でも、100行程度でも、5秒程度の遅延が発生しています。
###補足情報(言語/FW/ツール等のバージョンなど)
・Windows10
・jdk8
・tomcat8
(サーブレットの設定は、インストール直後の状態です。)
  • Java

    24148 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Tomcat

    903 questions

    TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

1 タイトルを具体的にし、とソースコードを簡潔にいたしました。

itmsd

itmsd score 16

2016/09/05 17:20  投稿

サーブレットから動的に作成したCSVをダウンロードさせたいと思います。
サーブレットから動的に作成したCSVを遅延なく記録させたい。
###前提・実現したいこと
サーブレットでCSVを作成させて、作成が完了した際はダウンロードボタンを
JSPで表示させて、それをクリックすると”開く”の選択肢が表示されますので、
”開く”をクリックしてExcelで表示させることを希望しております。
サーブレットでCSVを作成させて遅延なくハードディスクへ記録させたいと思います。
###発生している問題・エラーメッセージ
サーブレットを実行し、作成直後に表示されたダウンロードボタンをクリック
すると、開けなかったり、一つ前に実行した内容だったりするのですが、
ダウンロードボタンを5秒程度待ってからクリックしてやると問題ありません。
ソフト上は作成実行が終了しているのですが、実際にハードディスクに記録される
のに時差があるようです。
サーブレットを実行し、CSVを作成するのですが、実際にハードディスクに記録
されるまでに5秒程度の遅延が発生しています。
上記と同じことを、jdk1.4とtomcat3の組み合わせで実行しているときは、問題
なく運用できておりましたが、jdk8とtomcat8の環境に変えてから上記の問題が
発生するようになりました。
対応策をご教示いただければ、幸甚にぞんじます。
ソースコード問題、tomcat等の設定でお気づきの点がございましたら、
ご教示いただければ、幸甚にぞんじます。
###該当のソースコード
 private void downloadCSV(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws ServletException, IOException {  
   SalesAggregateBeans rows = (SalesAggregateBeans)session.getAttribute("salesAggregate");  
   SysUserBeans loginUser = (SysUserBeans)session.getAttribute("loginUser");  
 
   String fileName;
   fileName = sc_.getRealPath("/data/210.csv");
   rows.setReqPrintUrl(response.encodeURL("/example/data/210.csv"));
   rows.setReqPrintUrl(response.encodeURL("/example/data/.csv"));
   FileOutputStream fo = new FileOutputStream(fileName);
   OutputStreamWriter ps = new OutputStreamWriter(fo, "SJIS");
   String br = System.getProperty("line.separator");
   int iMax = rows.getSize();
   int iMax = rows.getSize();  
   for (int i = 0; i < iMax; i++) {
     rows.getRow(i);
     ps.write("\"" + rows.getCd() + "\",\"");
     if (i < (iMax-1)) {
       ps.write(rows.getName() + "\",\"");
       ps.write(rows.getAddress() + "\",\"");
       ps.write(rows.getReadings() + "\",\"");
       ps.write(rows.getSalesmanName() + "\",");
     } else {
       ps.write("*合計*\",,,,");
     }
     ps.write(rows.getName() + "\",\"");
     ps.write(rows.getAddress() + "\",\"");
     ps.write(rows.getReadings() + "\",\"");
     ps.write(rows.getSalesmanName() + "\",");
     ps.write(rows.getCarryOver() + ",");
     ps.write(rows.getSum(0) + ",");
     ps.write(rows.getSum(1) + ",");
     ps.write(rows.getSum(2) + ",");
     if (rows.getReqTaxCalcFlag()) {
       ps.write(rows.getBalance() + ",");
       if (rows.getTaxDiv() == 1) {
         ps.write(rows.getNetTaxable() + ",");
       } else {
         ps.write("0,");
       }
       ps.write(rows.getSum(3) + br);
     } else {
       ps.write(rows.getBalance() + br);
     }
     ps.write(rows.getBalance());
   }
   ps.flush();  
   ps.close();
   ps = null;
   sc_.getRequestDispatcher("/view/sales/salesDownload.jsp").forward(request, response);  
   fo.close();  
   fo = null;  
   sc_.getRequestDispatcher("/view/sales/salesAggregate.jsp").forward(request, response);  
 }  
###試したこと
 上記コードの、ps=null;とsc_.getRequestDispatcher("/view/sales/salesDownload.jsp").forward・
 の間に、下記のコードを挿入して、ファイルがディスクに記録するのを待たせてしのいでいます。
   try{
      // これで5秒スリープします。
      Thread.sleep(5000);
   } catch(InterruptedException e) {
      System.out.println(e.getMessage());
   }
 CSVの出力件数は、わずか5行でも、100行程度でも、5秒程度の遅延が発生しています。
###補足情報(言語/FW/ツール等のバージョンなど)
・Windows10
・jdk8
・tomcat8
・tomcat8
(サーブレットの設定は、インストール直後の状態です。)
  • Java

    24148 questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Tomcat

    903 questions

    TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る