0

JSP を使用してページに 5000 レコードを表示しようとしています。しかし、メモリ不足の例外が発生しています。私はそれをやっています、

<TABLE><tr><td>Header1</td><td>Header2</td><td>Header3</td><td>Header4</td><td>Header5</td></tr>");
    <%Test test = new Test();
         List myList = test.fetchdata();

        Iterator itr  = myList.iterator();
        while(itr.hasNext())
        {       
          Object[] row = (Object[]) itr.next();
          String hdr1 = (String) row[0];
          String hdr2 = (String) row[1];
          String hdr3 = (String) row[2];
          String hdr4 = (String) row[3];
          String hdr5 = (String) row[4];
              stringBuilder.append"<tr><td>'"+hdr1+"'</td><td>'"+hdr2+"'</td><td>'"+hdr3+"'</td><td>'"+hdr4+"'</td><td>'"+hdr5+"'</td></tr>");              
        }
 stringBuilder.append("</TABLE></body></html>");
 out.print(stringBuilder.toString()); 
  %>

1) 画面に 5000 レコードを保持することを決定したい場合、私のコードに何か問題がありますか?

2)または、ページネーションなどを使用すると、このエラーは発生しますか?

4

2 に答える 2

1

あなたのコード例は何らかの形で壊れているため、言うのは難しいですが、メモリの問題を引き起こす場所が 2 つあります。A) test.fetchdata() B) StringBuilder への追加

B から始めて、JSP を直接使用している場合は、StringBuilder を使用するのではなく、直接出力してみることができます。JSP コンパイラによっては、多くのメモリを消費しない小さな StringBuilders が生成される場合があります。

しかし、ほとんどの場合、問題は A にあります。すでに多くのメモリを占有している長いリストが返されます。結果の遅延読み込みを (イテレータで) 実行するか、ページネーションによって自分で提案したように最適化することしかできません (すべてのコメントが示すように、これは推奨されます:-) )

そして、重複する文字列がたくさんある場合に試してみる価値のある最後のオプションが 1 つあります。fetchdata() メソッド内では、文字列を配列に格納する前に .intern() を使用します。これにより、複数の同一の文字列が追加のヒープを占有するのを防ぎますが、これを計算するための CPU 時間が少しかかります。

于 2012-11-25T21:24:13.300 に答える
0

私は追加でこのようなことをもっと考えていました。

    List myList = test.fetchdata();

    Iterator itr = myList.iterator();

    StringBuilder stringBuilder = new StringBuilder("");

    while (itr.hasNext()) {
        Object[] row = (Object[]) itr.next();
        String hdr1 = (String) row[0];
        String hdr2 = (String) row[1];
        String hdr3 = (String) row[2];
        String hdr4 = (String) row[3];
        String hdr5 = (String) row[4];
        stringBuilder.append("<tr><td>'").append(hdr1)
                .append("'</td><td>'").append(hdr2).append("'</td><td>'")
                .append(hdr3).append("'</td><td>'").append(hdr4)
                .append("'</td><td>'").append(hdr5).append("'</td></tr>");
    }
    stringBuilder.append("</TABLE></body></html>");
    out.print(stringBuilder.toString());

または、これをリファクタリングする可能性があります。

    List myList = test.fetchdata();

    Iterator itr = myList.iterator();

    StringBuilder stringBuilder = new StringBuilder("");

    while (itr.hasNext()) {
        Object[] row = (Object[]) itr.next();
        stringBuilder.append("<tr><td>'").append(row[0])
                .append("'</td><td>'").append(row[1]).append("'</td><td>'")
                .append(row[2]).append("'</td><td>'").append(row[3])
                .append("'</td><td>'").append(row[4]).append("'</td></tr>");
    }
    stringBuilder.append("</TABLE></body></html>");
    out.print(stringBuilder.toString());
于 2012-10-02T23:37:32.977 に答える